Skip to content
Go back

ムーブとnull禁止は両立できるか

· Updated:
  • ポインタ相当のオブジェクトをnullにできないようにしたいと考えてみる
    • null禁止にすればnullチェックしなくて良くなるので、考えることが減って嬉しい
  • 実際にnullにならないオブジェクトを考えてみると、課される制約がかなりキツい
    • 所有権が単一の場合、使えるのはスワップのみ
      • null禁止オブジェクトをムーブ元とするムーブ・コンストラクタは実装できない
        • このときのムーブ先はnull相当なので、null禁止オブジェクトとスワップできない
      • null許可オブジェクトをムーブ元とするムーブ・コンストラクタは実装できる
        • その代わり、nullチェックのオーバーヘッドが発生する
    • 所有権が複数の場合、コピーとスワップが使える
      • null禁止オブジェクトをムーブ元とするムーブ・コンストラクタはコピーで実装できる
        • 本来不要であるはずの所有権操作などのオーバーヘッドが発生し得る
      • null許可オブジェクトをムーブ元とするムーブ・コンストラクタは実装できる
        • その代わり、nullチェックのオーバーヘッドが発生する
  • 不便だからといって制約を緩めることはあまり意味がない
    • ムーブを解禁するとムーブ後の状態がnull相当になって本末転倒になる
    • ムーブ後のオブジェクトに触るとコンパイルエラーになるような方法はなさそう
      • そもそもC++において、ムーブ後のオブジェクトは状態不明なだけの有効なオブジェクトなので、使いまわしてもなんの問題もない
  • なので、現状ではそこまで有用性はなさそう
    • 構築時のみnullチェックするviewのようなものは有用かも

参考文献