2013-04-02 11 views

答えて

5
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?

希望に役立ちます。

1

C++ 11のとおりuniform initialization機能は、タイプを初期化するにはいくつかの方法を提供する導入されました。

この場合、両方の構文はclass_name(class_name const&)コピーコンストラクタ(存在する場合)を呼び出します。したがって、実際の違いはありません。それは単に好みの問題です。

それは、{}構文は常にこの場合のように動作していないことに注意することである。適切な型のinitialization_listコンストラクタがある場合は、そのコンストラクタが使用され、そうクラス要素が適切なコンストラクタを使用して初期化されます。

もしも関数プロトタイプと解釈される可能性があるならば、それは次の2つのうちどちらか一方を使用する必要があります。ない関数プロトタイプ:

typename class_name obj_name(func()); 
class_name obj_name { func() }; 
関連する問題