std::mutex
標準がそう言っているという理由だけでコピー可能ではありません。std::mutex
彼らはおそらくコピー可能なものを書くことができたでしょうが、そうしないことにしました。
推測として、コピー不可のstd::mutex
方が効率的で、安全で、理解しやすいかもしれません。
例として、より安全で理解しやすい理由を以下に示しますstd::mutex
。私は、個人的に、正しい答えが何かわかりません。正解は「それはナンセンス」だと思います。「最小の驚きの答え」はありません。
同時実行コードで驚くべき答えが得られる代わりに、コピーをブロックすることで問題を回避します。コピーしたいミューテックスを保存する人は、何をしたいかを自分で決める必要があります。
C++ は、状況によってはコピー コンストラクターを自動的に生成します。より多くの状況では、あなたがそれMyClass(MyClass const&)=default
を求めたときにそれを実行して書くことができます。
クラスにコピー不可能なクラスが含まれている場合、クラスは生成されず、それを要求することはできません。これは、生成されたコピー コンストラクターが基本的にそのメンバーをコピーするためです。メンバーをコピーできない場合は、コピー コンストラクターを生成できません。
標準がそうmutex
言っているので、コピーすることはできません。
構造体またはクラスにコピーできないメンバーが含まれている場合、既定のコピー コンストラクターは使用できません。明示的に自分で書く必要があります。
型が を格納する必要がある場合、mutex
他のすべてのメンバーを手動でコピーするコピー ctor を維持しなければならないという頭痛を防ぐための 1 つの方法は、非mutex
状態をサブ構造体に貼り付けてから、その既定のコピーを使用することです。mutex
次に、コピー中に何をするかを決定し、コピー ctor (および代入コピー演算子) はシンプルなままです。
struct bob_with_mutex {
sturct bob_simple_data {
int x, y, z;
std::vector<char> buff;
};
bob_simple_data data;
std::mutex m;
bob_with_mutex( bob_with_mutex const& o ):
data(o.data)
{}
bob_with_mutex& operator=( bob_with_mutex const& o )
{
data = o.data;
return *this;
}
};
この型bob
にはミューテックスと一部のデータが混在しています。データはサブ構造体に格納されます。の copy ctor をbob_with_mutex
デフォルトにすることはできませんが、単に「データをコピーし、それ以外は何もコピーしない」と言っています。
のコピーにはbob
独自のミューテックスがあります。