初期化リストについての話で、Stroustrupは基本的に、中括弧を使用した新しい構築構文は、以前のすべての構築構文の一般的な置き換えになるはずだと言っていることを理解しました。
X x1(); // most vexing parse ... doesn't work as intended
X x2(x1);
X x3 = x1;
X x4 = X();
代わりに、新しい構文は、あらゆる状況で使用できる可能な代替として一律に使用されることになっています...繰り返しますが、それは私が彼の話から取ったコアメッセージです。多分私は彼を誤解した。
それで、問題は、この構文がどれほど一般的かということです。新しいC++11コードで古いスタイルの構造を使用しないことは可能ですか、それとも元に戻さなければならない状況がありますか?
この質問は、コンパイラのエラーであると思われる次のエラーが発生したときにトリガー/動機付けられました(ただし、修正できれば幸いです)。
struct X {};
int main() {
X x;
X& y{x}; // works with (x)
X& z{y}; // works with (y)
}
これはg++4.7.1でもコンパイルされず、 ideoneの4.5.1でもコンパイルされません。
prog.cpp: In function 'int main()':
prog.cpp:5:9: error: invalid initialization of non-const reference of type 'X&' from an rvalue of type '<brace-enclosed initializer list>'
prog.cpp:6:9: error: invalid initialization of non-const reference of type 'X&' from an rvalue of type '<brace-enclosed initializer list>'
に置き換えるX
と機能することに注意してくださいint
。