我有以下代码:
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非本地类中的声明首先声明一个类或函数,那么友元类或函数是最内层封闭命名空间的成员.在该命名空间作用域中提供匹配的声明之前,通过非限定查找或限定查找找不到该好友的名称.
| 归档时间: |
|
| 查看次数: |
1718 次 |
| 最近记录: |