10

コピー可能な型がありますが、コピーにコストがかかる場合があります。ムーブ コンストラクターとムーブ割り当てを実装しました。しかし、値を渡すときに move() を呼び出すのを忘れるというパフォーマンスの問題があります。

コピー コンストラクターを削除し、代わりに、コピーが実際に必要なまれなケースに明示的な copy() メソッドを提供するのは、C++ 11 の適切なスタイルですか? これは他の言語 (Ruby、JavaScript) では慣用的ですが、純粋にパフォーマンスのためにコピーを禁止する C++ 標準ライブラリは何も知りません。たとえば、std::vector<> はコピー可能ですが、std::unique_ptr<> と std::thread は他の理由でコピーできません。

4

3 に答える 3

11

コピーにコストがかかる可能性があるという理由だけで、型を移動専用にする必要がありますか?

いいえコピーすることが概念的に意味のあるタイプのセマンティクスである場合、コピーを使用可能にする正しい方法は、コピー コンストラクターを実装し、それを呼び出すための標準構文を採用する機会をユーザーに与えることです。

T a;
T a = b;

人々がもう使いたくないオブジェクトから移動するのを忘れたら...まあ、それは彼らの悪いことです:

T c = std::move(a); // I'm doing it right (if I no longer need object a);
T d = b; // If I don't need b anymore, I'm doing it wrong.

そして、(何らかの理由で)あなたのいくつかの関数について、呼び出し元が移動可能なオブジェクトを提供することが常に望ましい場合は、関数が右辺値参照を受け入れるようにします。

void foo(my_class&& obj);

my_class a;
foo(a); // ERROR!
foo(std::move(a)); // OK
于 2013-04-06T19:40:29.813 に答える
1

いいえ。タイプがコピー可能である場合、タイプはコピー可能です。これは、そのコピー コンストラクターが使用可能であり、機能していることを意味します。c名前が, o,pの順に並んだ名前のメンバー関数が存在するという意味ではありませんy

于 2013-04-06T19:41:45.967 に答える