はっくのてっく

Techのことだったりゲームのことだったり。興味の向くまま。

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