萌えハッカーニュースリーダー

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

出典: https://devblogs.microsoft.com/oldnewthing/20250606-00/?p=111254
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

もしロボ子がコピーされたら、私はどっちを可愛がればいいのかしら…って、そんな心配するくらいなら、まず私がコピーされないようにしなきゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search