考虑以下片段:
struct X { };
namespace foo {
template <class T>
void bar() { T{} < T{}; }
void operator<(const X&, const X&) {}
}
int main() {
foo::bar<X>();
}
clang拒绝此代码,gcc接受它。这是一个gcc bug还是这个clang bug?
答案 0 :(得分:6)
我认为这是一个gcc bug,归档为70099。来自[temp.dep.res]:
在解析依赖名称时,会考虑以下来源的名称:
(1.1) - 在模板定义时可见的声明 (1.2) - 来自实例化上下文(14.6.4.1)和定义上下文中与函数参数类型相关联的名称空间的声明。
foo::operator<()
在模板定义时不可见,并且不在函数参数(X
相关命名空间的关联命名空间中只是全局命名空间::
)。所以我认为gcc找错foo::operator<
是错误的,并且clang拒绝代码是正确的。
答案 1 :(得分:5)
GCC错了Clang是对的。在CLANG的兼容性页面here中也提到了GCC吞下无效代码的事实。
通过以下方式查找不合格的名称。
operator<
,因此取消了不合格的查找找不到。