Skip to content
Blog
Go back

C++:未定義と未規定

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

参考文献#


Share this post:

Previous Post
引数が消失するClangのバグ?
Next Post
C++:type_identity