朋友功能在课堂上不可见

Aby*_*byx 11 c++

我有以下代码:

struct M {
    friend void f() {}
    M() {
        f(); // error: 'f' was not declared in this scope
    }
};

int main() {
    M m;
}
Run Code Online (Sandbox Code Playgroud)

实例

g ++ 4.8和clang3.4都无法编译它,因为它们f在内部不可见M,或者他们说.

但是,标准给出了类似代码的示例

class M {
  friend void f() { } // definition of global f, a friend of M,
                      // not the definition of a member function
};
Run Code Online (Sandbox Code Playgroud)

并说

friend类中定义的函数位于定义它的类的(词法)范围内.

(ISO/IEC 14882:2011 11.3朋友[class.friend] p6,p7)

由此我无法理解编译器如何找不到f在使用它的同一类中定义的内容.

两个编译器都不太可能有相同的bug.
那么,我错过了什么?

Mik*_*our 12

friend声明声明f在周围的命名空间中调用的函数是该类的朋友; 但它没有将名称f引入命名空间.除非在命名空间中声明,否则它不可用(除了依赖于参数的查找).

相关规则是C++ 11 7.3.1.2/3:

如果friend非本地类中的声明首先声明一个类或函数,那么友元类或函数是最内层封闭命名空间的成员.在该命名空间作用域中提供匹配的声明之前,通过非限定查找或限定查找找不到该好友的名称.