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

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

最佳答案

是的,这是一个错误。我很惊讶它找到了这个功能。显然 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/

相关文章:

C++:使用指向派生类的指针进行虚函数调用仍然有一个vlookup

c++ - 如何通过 decltype 声明迭代器的值

c++11 - 迭代 std::array 中的记录

c++ - 在 C++ 中,命名参数的范围是否包括其默认值的表达式?

c++ - 使用 "const cv::Mat &"、 "cv::Mat &"、 "cv::Mat"或 "const cv::Mat"作为函数参数的区别?

c++ - 模板按值返回,指针在cpp/h

c++ - 并行RNG中的错误

c++ - 确定平台的行分隔符的可移植方法

c++ - 使用 qt 为发送者和接收者自动生成的 Ui

c++ - 派生类中的模板有问题