2017-06-24 10 views
1

したがって、コピーコンストラクタのパラメータリストは、const B& xのようなconst値の参照で構成されます。 しかし、移動コンストラクタのパラメータリストは、B&& xのようなrvalue参照で構成されています。rvalueの参照とconstの左辺の参照との間の混乱

私はこれを発見したとき、それは私には奇妙に思えたので、私は、引数としてのconst左辺値の参照を取る関数を定義しようとした:

void calculator(const Intvec& veccor) 
{ 
cout << "in veccor" << veccor.m_size << "\n"; 
} 

私はすでにのconst左辺値参照は何に結合することができることを知っていました、その結果は期待されたものでした。私は両方と左辺値と右辺値とし、期待通りに機能を呼び出してみました、それはすべてが働いた:

calculator(Intvec(33)); //works 
Intvec newvec(22); 
calculator(newvec); //works 

を私は、右辺値参照にcalculatorのパラメータリストを変更しようとしました、そして予想通り、唯一の右辺値は働いていましたそれを呼び出すとき。

const lvalue参照はlvaluesとrvaluesの両方を引数として取ることができるので、なぜ移動コンストラクタはrvalue参照の代わりにconst lvalue参照を使用するだけではありませんか? そして、通常、常に左辺値参照を使用するのではなく、移動コンストラクタで起こっていることと同じことをしない場合のように、

+5

これは 'const'なので、その内容を"盗む "ことができる前にconstをキャストしなければなりません。また、(値が移動される)実際には 'const'と宣言され、未定義の振る舞いに導くことがあります。 –

答えて

1

移動コンストラクタがconst左辺参照を受け入れた場合、そのような移動コンストラクタの宣言はコピーコンストラクタと区別できません。それらを区別する方法が存在しなければならず、言語は、移動コンストラクタがrvalue参照を引数としてとるように指定されています。

const lvalue参照を受け入れる移動コンストラクタでは、オブジェクトから移動されたオブジェクトを変更することができないため、コピーコンストラクタではできなかったことはできません。実際、このような移動コンストラクタは、あらゆる点でコピーコンストラクタと同じです。コピーコンストラクタとまったく同じときに何かを移動コンストラクタと呼ぶのはなぜですか?


PS。あなたの実験では、興味深い事実が明らかになります。クラスにコピーコンストラクタがあり、ムーブコンストラクタが明示的に削除されていない限り、ムーブコンストラクタを持つかどうかにかかわらず、そのオブジェクトの使用方法には影響しません。移動が適切な場合は、そのクラスに移動コンストラクタがない場合はコピーを代わりに使用できます。

+0

実際、正確に言うと、明示的に削除された移動コンストラクタがないクラスは、コピーコンストラクタを持っていれば移動可能と見なされます。移動不可能なクラスは、明示的に削除された移動コンストラクタを持つクラスであり、それを移動することは違法ですが、それでもコピーすることは合法です。 [ライブ](http://ideone.com/xsCWa8) –

+0

@PasserBy良い点。言葉遣いがより正確になるはずです。 – user2079303

関連する問題