4

たとえば、私はクラスAを持っています

今私がやっているとき

A a(A()); 

正確には何が起こりますか?

4

2 に答える 2

11

外観にもかかわらA a(A());ず、オブジェクト定義ではありません。a代わりに、を返し、A何も取らず を返す関数へのポインタを受け取る関数を宣言しますA

オブジェクト定義が必要な場合は、別の括弧のペアを追加する必要があります。

A a((A()));
于 2012-05-29T16:58:45.533 に答える
8

正しく記述されている場合 - A a((A()))- コンパイラーは、余分なコピーを防ぐために、コンストラクターのコンテキストで一時的なものを直接作成します。それはコピー省略と呼ばれます。RVO と NRVO とともに、これを調べてください。

あなたのコメントから:

A a = A();

これは正確

A a((A())); // note extra pair of parenthesis 

@Naveenが正しく指摘したように、A a(A());最も厄介な解析の対象となるため、実際にオブジェクトを作成するには追加の括弧が必要です。

于 2012-05-29T16:56:02.813 に答える