Bunun için bir GCC hatası gönderiyordum, ancak bunu iki kez kontrol etmeyi tercih ediyorum.Brace-initialization vs Parenthesis Bug
#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); }
ve:
#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); }
Son Clang ve MSVC derleyiciler iki programı kabul
şu programları düşünün. GCC 5 ve ötesi, ilk programı kabul ediyor ancak ikincisini reddediyor, invalid cast of an rvalue expression of type 'int' to type 'int&'
.
Bu bir GCC hatası mı? Veya bu gerçekten yukarıdaki bağlamda T{}
ve T()
arasındaki (ve böylece Clang ve MSVC'de bir hata) arasındaki fark nedir?
Düzenleme: sorun aşağıdaki basit alıntılar için daraltılabilir
:
int i; (int&){i};
ve
int i; (int&)(i);
Adsız bir lvalue başvurusunu tanımlayabilir ve başlatabilir misiniz? Hata zaten yanlış görünüyor. – krzaq
@krzaq: Neden göremiyorum. Ayrıca, bu hatayı 'noexcept' ifadesinde vurdum, bu yüzden bir ifade bağlamındaki durumu anlamak istiyorum. – alecov
Bu, [temel sorun 1288] 'dir (http://wg21.link/cwg1288). GCC'nin kararını uygulamaya koyması gerekiyordu, ama belki de tamamen sabit değildi. –