C++でコピー代入演算子が削除される話
誰かが作ったstructがあって、そのstructでコピー代入が必要になったときのお話です。
何の気なしにこんなふうに書くと、コンパイルエラーになってしまいました。
MyStruct a; a = MyStruct();
error: Object of type 'MyStruct' cannot be assigned because its copy assignment operator is implicitly deleted
MyStructのコピー代入演算子が暗黙に削除されているため、代入はできません。と言われていますね。
試しにコピー代入演算子を明示的にdefault宣言してみます。
MyStruct& operator=(const MyStruct& st) = default;
warning: Explicitly defaulted copy assignment operator is implicitly deleted
default宣言では暗黙削除されてしまうようでした。
ここで初めてMyStructの中身を見ると、原因がわかりました。
struct MyStruct
{
int number;
...
const MyString& text; // お前や!!!
...
MyStruct();
};
const参照のメンバがいます。
おそらく、文字列型でコピーコストが重いので、コピーを禁止していたのかもしれません。
C++ではconstまたは参照のメンバが存在するとき、そのクラスにデフォルトで生成されるコピー代入演算子はdelete宣言されます。
(今回はstructでしたが、C++ではclassとstructはほとんど同じものです。)
cppreference.com にも記載があります。
Deleted implicitly-declared copy assignment operator の項目です。
Copy assignment operator - cppreference.com