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以降は最初のプログラムを受け入れますが、2番目のプログラムを拒否して、invalid cast of an rvalue expression of type 'int' to type 'int&'
と申します。
これはGCCバグですか?または、これは確かに上記の文脈でT{}
とT()
の違いです(したがってClangとMSVCのバグ)?
編集:
問題は、次のように簡単抜粋に絞り込むことができます。
int i; (int&){i};
と
int i; (int&)(i);
名前のない左辺値参照を定義して初期化することはできますか?エラーはとにかく間違っているようです。 – krzaq
@krzaq:私はなぜそうは思わない。また、私は 'noexcept'式でこのエラーに当たったので、式の文脈で状況を理解したいと思います。 – alecov
これは[コアの問題1288](http://wg21.link/cwg1288)です。 GCCは決議を実施しているはずですが、おそらくそれは完全に修正されていませんでした。 –