在类中定义的友元函数模板是否可用于查找? clang ++和g ++不同意

时间:2014-05-04 02:40:59

标签: c++ templates c++11 friend function-templates

以下是代码:

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 ++错误。

1 个答案:

答案 0 :(得分:7)

是的,这是一个错误。我很惊讶它找到了这个功能。显然GCC完全没有隐藏功能模板。

这个C ++ 03示例也编译,因此可能是回归:

struct foo {
  template<typename T >
  friend void f( T ) { }

};

int main() {
  f( 3 ); // clang++ can't find it, g++ can.
}