さて、これ:
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
MyClass
技術的には、メンバーや友人がコピーすることはまだ許可されています. 確かに、これらの型と関数は理論的にはユーザーが制御できますが、クラスはまだcopyableです。少なくともboost::noncopyable
と= delete
では、誰もクラスをコピーできません。
C++11 でクラスをコピー不可にする方が簡単だと主張する人がいる理由がわかりません。
「消化しやすい」ほど「簡単」ではありません。
このことを考慮:
class MyClass
{
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
};
あなたが C++ の入門テキストを読んだことがあるが、慣用的な C++ にほとんど触れていない C++ プログラマー (つまり、多くの C++ プログラマー) である場合、これは... 混乱を招きます。コピー コンストラクターとコピー代入演算子を宣言しますが、それらは空です。では、なぜそれらを宣言するのでしょうか。はい、それらは ですprivate
。しかし、それだけではさらに疑問が生じます。なぜそれらを非公開にするのですか?
これがコピーを妨げる理由を理解するには、それらを非公開と宣言することで、非メンバー/友人がコピーできないようにすることを理解する必要があります. これは、初心者にはすぐにはわかりません。また、コピーしようとしたときに表示されるエラー メッセージもありません。
次に、C++11 バージョンと比較します。
class MyClass
{
public:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
};
このクラスがコピーできないことを理解するには何が必要ですか? = delete
構文の意味を理解することに他なりません。C++11 の構文規則を説明している本は、それが何をするかを正確に教えてくれます。このコードの効果は、経験の浅い C++ ユーザーには明らかです。
この慣用句の優れている点は、言いたいことを正確に伝える最も明確で明白な方法であるため、慣用句になることです。
もう少しboost::noncopyable
考える必要があります。はい、それは「コピー不可」と呼ばれているため、自己文書化されています。しかし、これまでに見たことがない場合は、疑問が生じます。なぜコピーできないものから派生しているのですか?boost::noncopyable
エラー メッセージがのコピー コンストラクターについて言及しているのはなぜですか? 繰り返しますが、慣用句を理解するには、より多くの精神的な努力が必要です。