本地类中友元函数的名称查找

Name lookup of friend function in local class

本文关键字:查找 函数 友元      更新时间:2023-10-16

编译以下内容:

void bar() { /* ... */ }
void foo()
{
    struct MyStruct
    {
        friend void bar();
    };
}
int main()
{
    //..
}

导致错误:

错误:本地类中没有先前声明的友元声明"void bar()"

为什么名称查找失败?我该怎么修?

即使您是The name of a local class is local to its enclosing scope-§9.8/1中的好友,也不能访问超出其封闭范围的本地类。


然而,如果你只是想让它编译,明确地告诉它在全局范围内。。。

friend void ::bar();

*由于某种原因,这在VS中修复了它,但在GCC中没有修复

§11.3/11(感谢jrok)

如果友元声明出现在局部类(9.8)中,并且指定的名称是非限定名称,则查找声明时不考虑最里面的封闭非类作用域之外的作用域。