contract_assert ステートメント (C++26 以降)
From cppreference.com
contract_assert ステートメントは、内部条件を検証するために関数またはラムダの本体に出現する契約アサーションです。これは、実行中に条件が保持されることを保証し、条件が false と評価されるか、評価が例外を介して終了した場合にデバッグビルドで違反 (例: 終了) をトリガーし、パフォーマンスのためにリリースビルドでは無視できます。
目次 |
[編集] 構文
contract_assert attr (オプション) ( predicate ) ; |
|||||||||
| attr | - | 任意の数の属性 |
| predicate | - | true と評価されるべきブール式 |
[編集] キーワード
[編集] 注釈
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_contracts |
202502L |
(C++26) | 契約プログラミング |
[編集] 例
contract_assert は、ベクトルのノルムが正であり、かつ正規化されているか非正規化されているかのいずれかであることを保証します。
template <std::floating_point T> constexpr auto normalize(std::array<T, 3> vector) noexcept pre(/* is_normalizable(vector) */) post(/* vector: is_normalized(vector) */) { auto& [x, y, z]{vector}; const auto norm{std::hypot(x, y, z)}; // debug check for normalization safety contract_assert(std::isfinite(norm) && norm > T(0)); x /= norm, y /= norm, z /= norm; return vector; }
[編集] 参照
- C++26 標準 (ISO/IEC 14882:2026)
- 8.(7+c) Assertion statement [stmt.contract.assert]
[編集] 関連項目
| ユーザー指定の条件が true でない場合にプログラムを異常終了させる。リリースビルドでは無効化されることがある。 (関数マクロ) | |
| 契約アサーション (C++26) | 実行中の特定の時点で保持されなければならないプロパティを指定します |
static_assert 宣言 (C++11) |
コンパイル時アサーションチェックを実行する |
| 関数契約指定子 (C++26) | 事前条件 (pre) と事後条件 (post) を指定します |
[[assume(expression)]](C++23) |
特定の時点でexpressionが常にtrueに評価されることを指定します (属性指定子) |