我想驗證以下是GCC中的錯誤,而不是我對C++的理解。考慮下面的代碼:驗證GCC中的錯誤
struct A
{
struct B
{
template< typename U > U as() const { return U(); }
};
B operator[](int) const { return B(); }
};
template< typename T >
struct as
{
template< typename U >
static T call(const U& u)
{
return u[ 0 ].as<T>(); // accepted by Clang 3.2, rejected by GCC 4.7
// return u[ 0 ].template as<T>(); // does not help and is IMHO not needed
// return u[ 0 ].A::B::as<T>(); // accepted by GCC 4.7
}
};
int main()
{
as<int>::call(A());
}
IMHO代碼要細,它是由鐺3.2接受,但不是由GCC 4.7(4.4和4.6也失敗,基本上是相同的錯誤,但4.4產生稍微不同的消息) 。下面是從我的殼輸出:
$ clang++-3.2 -O3 -Wall -Wextra -std=c++0x t.cc -o t
$ g++-4.7 -O3 -Wall -Wextra -std=c++0x t.cc -o t
t.cc: In static member function ‘static T as<T>::call(const U&)’:
t.cc:17:21: error: invalid use of ‘struct as<T>’
t.cc: In static member function ‘static T as<T>::call(const U&) [with U = A; T = int]’:
t.cc:18:4: warning: control reaches end of non-void function [-Wreturn-type]
$
問:這是海灣合作委員會中的一個bug還是我失去了一些東西?
編輯:我有點困惑:在http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55576的GCC錯誤報告在評論#9中說,評論#3中的代碼是「有效的」。這到底是什麼意思?它看起來像海灣合作委員會的人認爲它實際上是一個錯誤,否則他們會已經關閉它? OTOH @Potatoswatter的答案似乎很清楚,它應該是正確的,我應該提交一份針對叮鐺的錯誤報告(或者是否已經有這樣的錯誤報告?)
請注意,我毫不猶豫地將答案標記爲接受直到上述內容被澄清。既然這兩個答案都已經有幫助(一個解釋,一個解決方法),我同時給出了兩個答案。
獎金問題:由於我得到了非敘述性代碼的低估,我想知道別人的感受。我試圖創建一個SCCEE,它消除了所有的干擾並專注於技術問題。這就是我更喜歡考慮這些事情的方式。那是錯的嗎?
另外,@EdHeal:爲什麼代碼容易發生災難? (你不認爲這是我真實世界的代碼,對嗎?)
EDIT2:謝謝大衛,剛剛注意到你的編輯。我會將您的答案標記爲已接受,並且我還看到您對GCC錯誤報告發表了評論。我認爲這個問題的主要意見從而得到了答覆,海灣合作委員會得到了另一個提醒。感謝大家。
我相信這是一個已知的錯誤。 – Potatoswatter 2013-02-25 10:20:48
但是,由於'u [0]'是一個依賴表達式,所以'template'關鍵字是必需的。解析器需要能夠在不知道'U'的情況下找出'<'符號的含義,並且不需要查找'>'。 – Potatoswatter 2013-02-25 10:23:23
這就是我所想的,Clang應該拒絕這些代碼。 – Xeo 2013-02-25 10:25:13