首页 > 后端开发 > C++ > 正文

C 中内联友元函数的范围是什么?

Barbara Streisand
发布: 2024-11-24 14:12:28
原创
281 人浏览过

What is the Scope of Inline Friend Functions in C  ?

揭示内联友元函数的范围

在错综复杂的 C 语言迷宫中,理解内联友元函数的领域可能是一项艰巨的任务。为了解开这个谜团,让我们深入研究关键问题:此类函数的实际作用域是什么?

命名空间作用域中的友元函数声明

当内联友元函数时是在类中声明的,令人惊讶的是,它不会自动驻留在类范围内。相反,它在最近的封闭命名空间范围中建立存在。然而,这种存在仍然是模糊的,被不合格和合格查找的警惕目光所掩盖。

进入参数依赖查找:通向可见性的途径

尽管标准查找中内联友元函数难以捉摸,存在一个希望的灯塔,称为参数依赖查找(ADL)。当在包含类的对象或表达式的上下文中进行非限定函数调用时,这种秘密方法允许编译器揭示隐藏函数。

范围歧义的代码表现

为了说明范围的复杂性,请考虑以下代码snippet:

namespace foo {
  struct bar {
    friend void baz() {}
    void call_friend();
  };
}

int main() {
  foo::baz(); // can't access through enclosing scope of the class
  foo::bar::baz(); // can't access through class scope
}

namespace foo {
  void bar::call_friend() {
    baz(); // can't access through member function
  }
}
登录后复制

每次尝试调用 baz() 函数都会直接失败,突出显示了阻止通过不合格和合格查找直接访问的隐形障碍。然而,在 call_friend() 成员函数中,由于 ADL 的仁慈力量, baz() 不受范围限制的大放异彩。

标准授权印章

这种令人困惑的行为的明确解释位于 ISO/IEC 14882:2011 中标准:

“在命名空间中首先声明的每个名称都是该命名空间的成员。如果非本地类中的友元声明首先声明了一个类或函数,则友元类或函数是最内层的成员封闭名称空间无法通过非限定查找 (3.4.1) 或限定查找 (3.4.3) 找到,直到在该名称空间范围内提供匹配声明(在类定义授予之前或之后)。如果调用友元函数,则可以通过名称查找来找到其名称,该名称查找考虑与函数参数类型关联的命名空间和类中的函数 (3.4.2)。"

此摘录强调了下划线。没有显式命名空间限定而声明的友元函数的短暂性质。它们居住在封闭命名空间的空灵领域,在标准目光下仍然难以捉摸,除非通过 ADL 的神秘仪式召唤。

以上是C 中内联友元函数的范围是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板