考虑下面的代码片段:从属名称查找在函数模板:铿锵拒绝,GCC接受
struct X { };
namespace foo {
template <class T>
void bar() { T{} < T{}; }
void operator<(const X&, const X&) {}
}
int main() {
foo::bar<X>();
}
铛拒绝这段代码,GCC接受它。这是一个海湾合作委员会的错误,或者这是一个铿锵虫?
我不明白它是一个错误,因为'T'类型可以引用任何类型。如果那个类型'T'没有重载或支持'<'操作符,那么'bar'函数就会失败。既然你已经重载了'<'运算符,那就很好。我想这一切都归结为编译器如何读取代码,但语义 - 明智的是它不是容易出错的。 – Poriferous
@Poriferous这没有任何意义。问题是关于'bar()'的正确行为是什么,对于没有'operator <'的类型'T'。正确的行为是:“是的,它发现'bar :: operator <'”(在这种情况下,clang有bug)或“代码格式不正确”(在这种情况下,gcc有bug)。 – Barry
这是没有道理的,因为'bar'是一个函数,并且没有成员'operator <'。既然你已经为struct'X'定义了'operator <',我真的不知道这里有什么问题。即使运算符重载嵌入在结构体“X”中,代码仍应该正确编译。公平地说,它是铿锵有bug的,因为它似乎假定了什么类型。我的意思是,你是否尝试用'foo :: bar()'来替换'foo :: bar ()',看看clang是否会拒绝该代码? –
Poriferous