9
我正在爲此提交GCC錯誤,但我寧願仔細檢查一下。括號初始化與括號問題
考慮以下方案:
#include <utility>
template<typename T, typename A>
void F(A&& a) { T(std::forward<A>(a)); } // Note:() syntax.
int main() { int i; F<int&>(i); }
和:
#include <utility>
template<typename T, typename A>
void F(A&& a) { T{std::forward<A>(a)}; } // Note: {} syntax.
int main() { int i; F<int&>(i); }
最新鏘和MSVC的編譯器都接受的方案。 GCC 5及更高版本接受第一個程序,但拒絕第二個程序,聲稱invalid cast of an rvalue expression of type 'int' to type 'int&'
。
這是一個海灣合作委員會的bug?或者這是上述情況下T{}
和T()
之間的差異(並因此是Clang和MSVC中的錯誤)?
編輯:
這個問題可以縮小到以下簡單摘錄:
int i; (int&){i};
和
int i; (int&)(i);
你甚至可以定義並初始化一個未命名的左值引用嗎?反正這個錯誤似乎不正確。 – krzaq
@krzaq:我不明白爲什麼不。另外,我在'noexcept'表達式中出現了這個錯誤,所以我想了解表達式中的情況。 – alecov
這是[核心問題1288](http://wg21.link/cwg1288)。海灣合作委員會應該正在實施其決議,但也許並沒有完全解決。 –