const class_name obj_name{func()};
上記を書き込むことにより、著者は厄介な解析によって引き起こされる問題を回避するために、(C++ 11で導入された)均一な初期化構文に従うことをしようとしていますとは最も厄介な構文解析で、経験豊富なプログラマでさえ偶然に捕らえられます。彼は彼の脳にベストプラクティスを教えようとしているので、後で説明するように、時折、この解析問題に巻き込まれることはありません。
Y y(100); // declare an object y of type Y
罰金である第二のコンストラクタを呼び出すこと:
は、この、
struct X { /*....*/ }; // some class
struct Y
{
Y();
Y(int i);
Y(X x);
};
今1がこれを書くことができます考えてみましょう。これまでのところ、とてもうれしい!
しかし、誤って1でもこれを書く:
Y y();
(誤って)それはデフォルトコンストラクタを呼び出すことを考えます。しかし、実際には、デフォルトのコンストラクタを呼び出さないということです。代わりに、引数をとらない関数y
を宣言し、Y
を返します。これは、と呼ばれ、C++ではが解析されます。
同様に、一つは、それがその場で作成されたタイプX
のオブジェクトを渡す第コンストラクタを呼び出すことを考え、(誤って)
Y y(X());
これを書くことができます。再び、それは間違っています。代わりに関数ポインタ(何も取らず、X
を返す関数型)を受け取り、Y
を返す関数y
を宣言します。これは、と呼ばれ、C++ではが最も構文解析されます。
だから、均一な初期化構文はすべて、このような問題を回避し、あなたはこれを書くことができます。
Y y1{}; // invokes 1st constructor
Y y2{100}; // invokes 2nd constructor
Y y3{X{}}; // invokes 3rd constructor
と同じ構文を以下、均一と確かにベストプラクティス、ISN」です
Y { function_call() };
const class_name obj_name { func() }; // taken from your question!
t?
希望に役立ちます。