C++26標準ライブラリのハードニング:未定義動作を終了に変える新機能
C++26: Standard Library Hardening Experiments

C++26で導入された「ハードニング」は、標準ライブラリの前提条件違反を未定義動作ではなく、終了を伴う契約違反として検出する仕組みです。std::vectorのoperator[]を例に、ハードニングが有効な場合の動作の変化を解説。GCC、Clang、MSVCでの有効化方法や、span、optional、expectedなど他の型への適用範囲、実行時コストについても触れます。ハードニングはC++を完全に安全にするわけではなく、サニタイザや静的解析の代わりにはならないという点も強調します。
C++26のハードニングは、C++を突然メモリ安全にするわけでも、サニタイザや静的解析、優れたAPI設計、慎重な検証の代わりになるわけでもありません。
HNでの議論
42- steveklabnik
これに関して私が興味を持っていることの一つ:これらすべてがC++26に入ったと思っていたのに、まだhttps://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p43...のような論文が出ている。
> C++26ドラフトはまだ最終投票を終えていない
これはBjarneの共著であり、だからこそ簡単に間違っているとは思えないが、もしかしたら私が何かの詳細を見落としているだけかもしれない。BjarneがこれでC++26に拒否権を発動すると脅していたのは知っているが、彼は実際にはしなかったと思っていたのだが?
私よりも少しプロセスを追っている人で、何か背景を知っている人はいますか?
- Cieric
最後の方に少しヒントがあるが、コンパイル時契約アサーションがもっと一般的になることを本当に願っている。Spark、Dafny、その他いくつかの言語がそれをやっていて、0除算のようなものに対して暗黙の契約を生成することを知っている。私は自分自身のカスタム言語でこれらのことを試してきたが、毎日仕事でC++に戻ると、そのせいで少しがっかりすることがある。
- pama
30年遅れたが、それでも受け入れる。契約は例外よりも有用で、混乱も少ないように見える。