揭示内联友元函数的范围
在错综复杂的 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中文网其他相关文章!