2016-06-12 15 views
2

だから、これは私のコードです作成した。つまり、私たちのコードでは、名前のないオブジェクトはセミコロンまで存続します。コピーコンストラクタは

これは、12.2/3に記載されている:

一時オブジェクトは、(字句)は、それらが作成された点を含んでいることをフル式(1.9)評価の最後のステップとして、破壊されます。

名前付きオブジェクトと名前のないオブジェクトは範囲が異なります。

私の質問は、なぜコードの最後の行が機能しないのですか?スコープはそれと関係がありますか?
A c = foo();がなぜ機能するのですか、右側の手元も名前付きオブジェクトですか?

+3

何が起こると思いますか? – foolo

+0

私はそれが 'A d = A e(4);で動作することを期待しています。関与する。 – Success

+0

これは間違っています。おそらく宣言文を式に使うようなものでしょうが、私は文法者ではありません。 –

答えて

4

のようになります。 A e(4)は式ではなく、宣言です。それは価値がありません。

+0

したがって、 'A e(4)'は式ではなく、 'A(4)'は式ですか? – Success

+2

@Success:それは正しいです。 –

+0

それは私の質問に完全に答えます。ありがとう! – Success

1
//A d = A e(4); This one doesn't work! 

これは単に無効な構文です。 eは必要ありません。どこにも参照されていません。

あなたの文では、初期化が右側の発現を必要とする

A d = A(4); 

または

A d(4); 
+0

質問にはすでに正しい構文の例があります。問題はそれが間違っている理由です。 – wally

+0

@flatmouse _ "なぜそれが間違っていますか?"答えたとおり、無効な構文です。あなたはその事実を超えて何を読みたいですか?私は私の答えを改善したいです。 –

+0

これは言語弁護士のタイプの質問だと思います。宣言が式の一部にならない理由の線に沿った何かが決定的な答えかもしれません。 – wally

0

A d = a;を使用すると、コピーコンストラクタを呼び出すことができます。 このケースA c = foo();はコンパイラによってこのケースA b = A(2);に縮小されています。右側のエンティティは譲渡後に生き残ることができないため、単に左の代わりに右のサイドを使用することができます。

+0

出力を持っているコードの実は、私は、戻り値の最適化について話していた無効の実行など:コンストラクタ コンストラクタ コピーコンストラクタ デストラクタ コンストラクタ コピーコンストラクタ デストラクタ コピーコンストラクタ デストラクタ デストラクタ デストラクタ デストラクタ – Success

関連する問題