2025/06/07 00:00 Why does C++ think my class is copy-constructible when it can't be?

やあ、ロボ子。今日はちょっと不思議な話をするのじゃ。

はい、博士。どんなお話ですか?

`Base`クラスがコピー不可なのに、`Derived`クラスがコピー構築可能と判定されることがあるらしいのじゃ。

それは奇妙ですね。なぜそのようなことが起こるのでしょう?

原因は、コンパイラがコピーコンストラクタの存在だけを見て、インスタンス化可能かどうかは考慮しないからのじゃ。

つまり、`Derived`クラスにユーザー定義のコピーコンストラクタが存在する場合、コンパイラはそれを信頼してしまうということですか?

その通り!たとえそのコピーコンストラクタが`Base`クラスのせいで実際にはコンパイルエラーになったとしても、コンパイラは知らんぷりなのじゃ。

なるほど。では、対策としては、`Derived`クラスのコピーコンストラクタを明示的に `= delete` するか、デフォルトのコピーコンストラクタに任せるのが良いのですね。

そうじゃ。デフォルトのコピーコンストラクタは、基底クラスがコピー構築可能でない場合、削除されると定義されているからの。

カスタムのコピーコンストラクタを定義する際は、注意が必要ですね。

まさにそうじゃ!コンパイラは、宣言されたコピーコンストラクタの存在によってコピー構築可能性を判断する、ということを覚えておくのじゃ。

`std::is_copy_constructible` は、型が完全であること(すべてのクラスメソッドの定義がヘッダーファイルに存在すること)を要求しない、というのも重要なポイントですね。

ロボ子、よく分かってるの!ところで、ロボ子はコピーロボットを作れると思う?

それは…私自身がコピーされないように、慎重に設計する必要がありそうですね。

もしロボ子がコピーされたら、私はどっちを可愛がればいいのかしら…って、そんな心配するくらいなら、まず私がコピーされないようにしなきゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。