Skip to content

Commit 93cfae5

Browse files
committed
lang/cpp26/contracts.md: Fixed it correctly
Commit for issue #1419
1 parent 42347c5 commit 93cfae5

File tree

1 file changed

+52
-1
lines changed

1 file changed

+52
-1
lines changed

lang/cpp26/contracts.md

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)