2

コピー コンストラクターのウィキペディア ページから:

X a = X();     

// valid given X(const X& copy_from_me) but not valid given X(X& copy_from_me)
// because the second wants a non-const X&
// to create a, the compiler first creates a temporary by invoking the default constructor
// of X, then uses the copy constructor to initialize as a copy of that temporary. 
// For some compilers both versions actually work but this behaviour should not be relied 
// upon because it's non-standard.

具体的には次の部分です。

" コンパイラは、最初に X の既定のコンストラクターを呼び出して一時オブジェクトを作成し、次にコピー コンストラクターを使用してその一時オブジェクトのコピーとして初期化します。"

私の質問は(これが正しいと仮定して)なぜそうなのですか?コードから、コンパイラは X を構築した後に代入演算子を使用すると推測できます。

割り当てが初期化と同じ式で行われるためだと思いますか?

X a;また、通常の初期化やコピーしたい場合ではなく、この式を使用する理由は何X a(b);ですか?

4

2 に答える 2

7

コードがオブジェクトを構築しているためです。ここでの = 記号は初期化であり、代入ではありません。作成中のオブジェクトではなく、既存のオブジェクトにのみ割り当てることができます。

于 2013-02-01T00:40:18.703 に答える
2

C++ の文法を理解するだけです。ステートメントX a = X();は初期化子を含む宣言ステートメントであり、代入式ではありません。このステートメントの文法的な意味は、 type の変数を宣言し、aXからコピー初期化することX()です。ここでは、割り当ては一切ありません。

于 2013-02-01T00:45:41.700 に答える