考慮下面的代碼片段:從屬名稱查找在函數模板:鏗鏘拒絕,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