以下是代码:
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编译了它,但我认为它不应该这样做。这个问题是相关的,但没有明确的答案。第15.4.2/2,4节讨论了这个问题,但它们都没有表明在类中定义的友元函数模板应该与在类中定义的非模板友元函数有不同的可见性。
这只是我的学术兴趣,但它是由另一个人的问题引起的,这个人可能有一个实际的用例。
在我看来这似乎是g++的一个bug。
class
定义之外重新声明函数[template]。(更好的风格是使用namespace
和using
声明。) - Potatoswatter