@@ -17,6 +17,20 @@ C++26では、関数の正確な動作を明示的に指定でき、プログラ
1717この機能は、関数のインターフェースに対する期待値を明確にする役割があり、バグの早期発見、コードの可読性向上に寄与することが期待されている。
1818
1919## 仕様
20+ ### キーワード
21+ ` pre ` 、` post ` 、` assert ` は文脈依存キーワードである。これらは` override ` や` final ` と同様に、特定の文脈でのみ特別な意味を持つ。
22+
23+ - 変数名や関数名として使用可能
24+ ``` cpp
25+ int pre = 42 ; // OK: 変数名として使用
26+ void post () {} // OK: 関数名として使用
27+ ```
28+ - 契約指定の文脈でのみ特別な意味を持つ
29+ ``` cpp
30+ void f ()
31+ pre(true); // ここでは契約指定として機能
32+ ```
33+
2034### 契約の種類
2135契約には以下の3種類が定められている。
2236
@@ -35,6 +49,24 @@ int safe_division(int numerator, int denominator)
3549```
3650ここでは、` denominator ` が0でないことを事前条件として指定している。
3751
52+ 事前条件では、必ずしも関数のパラメータを使用する必要はない。グローバル状態やクラスのメンバ変数など、呼び出し時点で有効な任意の式を使用できる。
53+ ``` cpp
54+ class Resource {
55+ private:
56+ bool is_available = false;
57+ public:
58+ void use()
59+ pre(is_available) // 引数を使用していない事前条件
60+ {
61+ // リソースを使用
62+ }
63+
64+ void activate() {
65+ is_available = true;
66+ }
67+ };
68+ ```
69+
3870#### 事後条件(post)
3971関数の実行後に満たされているべき条件を指定する。
4072```cpp
@@ -48,6 +80,25 @@ int increment(int x)
4880
4981` post ` では、返り値を` r ` としてバインドし、条件式内で利用している。ここには、任意の変数名が使用できる。変数は定数(` const ` )な左辺値参照である。
5082
83+ 事後条件の結果名導入子(result-name-introducer)は省略可能である。特に、` void ` を返す関数では、戻り値を参照する必要がない場合に省略できる。
84+
85+ ``` cpp
86+ class Container {
87+ // ...
88+ public:
89+ void clear()
90+ post(empty()) // 結果名導入子を省略した事後条件
91+ {
92+ // コンテナの内容をクリア
93+ }
94+
95+ bool empty() const {
96+ // コンテナが空かどうかを返す
97+ return true;
98+ }
99+ };
100+ ```
101+
51102#### アサーション(assert)
52103関数の実行中に満たされているべき条件を指定する。
53104```cpp
@@ -101,7 +152,7 @@ g++ -std=c++26 -fcontracts -fcontract-semantic=observe main.cpp
101152以下の操作は、気をつけなければならない。
102153- 契約式内において副作用を要する式を記述した場合(グローバル変数の変更、` volatile ` 変数への参照、` constexpr ` でない関数の呼び出しなど)
103154- 契約式内で例外を送出すると、std::terminate()が呼び出され、プログラムが終了する。
104- - 通常の関数やメンバ関数には契約を適用できるが、特殊な関数(例えば` default ` によって定義されたコピーコンストラクタやデストラクタ)には適用できない。適用すると、プログラムは不正 (ill-formed)となる。
155+ - 通常の関数やメンバ関数には契約を適用できるが、特殊な関数(例えば` default ` によって定義されたコピーコンストラクタやデストラクタ)には適用できない。適用すると、プログラムは不適格 (ill-formed)となる。
105156
106157## <a id =" relative-page " href =" #relative-page " >関連項目</a >
107158- [ C++ 将来 契約に基づくプログラミング] ( /lang/future/contract-based_programming.md )
0 commit comments