【问题标题】:Is a friend function template defined in the class available for lookup? clang++ and g++ disagree类中定义的友元函数模板是否可用于查找? clang++ 和 g++ 不同意
【发布时间】:2014-06-20 13:08:04
【问题描述】:

代码如下:

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

【问题讨论】:

  • 是的。我也认为 g++ 是错误的。只是想看看其他人在阅读标准中的这些段落时是否与我不同,或者我是否错过了标准中的某些段落。
  • 我看到有人用这个来用函数替换方法。他们使用类作为范围。
  • @yngum 这是一个有效的技巧,但您必须在class 定义之外重新声明函数[模板]。 (不过,更好的方式是使用 namespace 和 using 声明。)
  • @yngum:这样做的动机是什么?为什么不使用命名空间?想到的一种可能性是利用部分专业化。

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


【解决方案1】:

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

这个 C++03 示例也可以编译,所以它可能是一个回归:

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

};

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

【讨论】:

  • 它也(显然)在没有默认模板 arg 的情况下被破坏。 (我将进行编辑以使其清楚。)如果不是模板,则 g++ 无法按预期找到它。
  • @user3521733 不用担心,我已经尝试过并更新了答案。
猜你喜欢
  • 2018-10-16
  • 2016-10-19
  • 2011-05-16
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多