0

次のコードがあるとします。

std::vector<myclass> v1;
v1.push_back (x1);
v1.push_back (x2);
std::vector<myclass> v2(v1);

上記のコードを実行すると、x1 と x2 の両方のコピー コンストラクターが呼び出されて、ベクター v2 が作成されます。これは正しい方法のようです。

しかし、このようにコードを書き直すと:

std::vector<myclass> v1, v2;
v1.push_back (x1);
v1.push_back (x2);
v2 = v1;

x1 と x2 のコピー コンストラクターが再度呼び出されます。それは正しい行動ですか?代入演算子が呼び出されないのはなぜですか? x1 と x2 の代入演算子を呼び出す方が一貫性があるのではないでしょうか? ベクトルのコピー代入は、その要素のコピー代入を意味しないようです。

コピーの構築とコピーの代入が異なるセマンティクスを持つ必要があるクラスがある場合はどうなりますか?

編集。v2=v1 の呼び出しの前に v2 は空ですが、2 つの要素を持つベクトルを作成した後にコピー代入を呼び出すべきではありませんか? 私にはもっと一貫しているように思えます...ところで、v2 = v1を呼び出そうとすると、使用していない場合でも、コンパイラはmyclassコピー代入演算子の定義を強制します。

4

1 に答える 1

1

x1andの代入演算子を呼び出すのは意味がありませんx2。どちらにも代入していないからです。v2の代入演算子は、その内部配列を のすべての要素に十分な大きさにしてから、 のすべての要素をv1にコピーv1v2ます。

于 2013-03-30T02:25:56.190 に答える