Skip to content
Go back

C++:未定義と未規定

· Updated:
  • 未定義undefined
    • 規格で示されず、処理系が好き勝手して良い部分
      • 配列の範囲外アクセスとか、符号あり整数のオーバーフローとか、要件を満たさないコードとか
      • 処理系は何も示さずに何をしても良い
    • その結果はプログラマが予期できるものにならない
      • 処理を省略したり、実行時エラーになったり
      • 期待通りに動作していても、それはたまたまでしかない
    • 未定義動作となるコードは排除されなければならない
      • 存在してもバグにしかなり得ないため
  • 未規定unspecified
    • 規格で示されず、処理系が実装を自由に選択して良い部分
      • move後のオブジェクトの状態とか、実引数の評価順序とか、静的変数の初期化順序とか
      • 処理系は何も示さなくて良いが、取り得る選択肢は想定されている
    • その結果はプログラマが予期できるものになる
      • 未定義動作のような”何でもあり”にはならない
    • 未規定動作となるコードは特別に気にしなくても良い
      • ただし、結果を厳密に定めたい場合には避ける必要がある
  • 処理系定義implementation-defined
    • 未規定とほぼ同様だが、文書に示す必要がある部分

参考文献