代码如下:
struct foo {
template<typename T = void>
friend foo f() { return {}; }
};
int main() {
auto x = f(); // clang++ can't find it, g++ can.
}
clang++ 3.4 给出:
fni2.cpp:8:12: error: use of undeclared identifier 'f'
auto x = f(); // clang++ can't find it, g++ can.
^
1 error generated.
g++ 4.9.0 编译它,但我不认为它应该有。 This是一个相关的问题,但没有明确的答案。第 15.4.2/2,4 节对此进行了讨论,但它们都没有提及类内定义的友元函数模板应该与类内定义的非模板友元函数具有不同的可见性。
这只是我的学术兴趣,尽管它确实是由可能有实际用例的其他人提出的问题引起的。
在我看来这像是一个 g++ 错误。
最佳答案
是的,这是一个错误。我很惊讶它找到了这个功能。显然 GCC 未能完全隐藏函数模板。
这个 C++03 示例也可以编译,所以它可能是一个回归:
struct foo {
template<typename T >
friend void f( T ) { }
};
int main() {
f( 3 ); // clang++ can't find it, g++ can.
}
关于c++ - 类中定义的友元函数模板是否可供查找? clang++ 和 g++ 不同意,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452015/