Skip to content

Commit dc0d6ab

Browse files
committed
update Mandates and Preconditions in resize_and_overwrite() (#1344)
1 parent 54b813b commit dc0d6ab

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

reference/string/basic_string/resize_and_overwrite.md

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,30 @@ constexpr void resize_and_overwrite(size_type n, Operation op); // C++23
1616
本関数は、`string` にいくつかの文字列をまとめて追加・代入する際に、パフォーマンスを向上させる目的で追加された。
1717
1818
19-
## テンプレートパラメータ制約
20-
`Operation` は2つの引数と戻り値を持ち、第1引数は `charT*` or `const charT*`、第2引数は `size_type` or `const size_type`、戻り値は `integer-like` であること。
19+
## 適格要件
20+
21+
`Operation`型の値 `op` は、下記を満たす呼び出し可能な型であること。
22+
23+
- 式`std::move(op)(data(), n)` が有効(第1引数 `data()` は `charT*`型、第2引数 `n` は `size_type`型)。
24+
- 戻り値型は `integer-like` を満たす。
25+
26+
27+
## 事前条件
28+
29+
- 呼び出された `op` が例外を投げないこと。
30+
- `op` の呼び出しで、第1引数・第2引数ともに変更されないこと。
31+
- `r = std::move(op)(data(), n)` とすると、`0 <= r && r <= n` であること。
32+
- `[data(), data() + r)` の範囲に未初期化の要素がないこと。
2133
2234
2335
## 要件
2436
`n <=` [`max_size()`](max_size.md)
2537
2638
2739
## 効果
28-
1. 関数実行前に `[`[`data()`](data.md)`, `[`data()`](data.md)` + n)` が有効範囲でないなら、領域の確保が行われる([`reserve(n)`](reserve.md) 相当)。
29-
1. `std::move(op)(data(), n)` が呼ばれる。`op` 内では、`[`[`data()`](data.md)`, `[`data()`](data.md)` + n)` の範囲に対して任意の初期化を行う。`op` の戻り値を `m` とすると、`0 <= m && m < n` であること。
30-
1. サイズを `m` に変更する([`resize(m)`](resize.md) 相当)
40+
1. 関数実行前に `[`[`data()`](data.md)`, `[`data()`](data.md)` + n)` が有効範囲でないなら、領域の確保が行われる([`reserve(n)`](reserve.md) 相当)。新たな領域は初期化されないことに注意。
41+
1. `std::move(op)(data(), n)` が呼ばれる。`op` 内では、`[`[`data()`](data.md)`, `[`data()`](data.md)` + n)` の範囲に対して任意の初期化を行う。
42+
1. `op` の戻り値を `r` とすると、サイズを `r` に変更する
3143
3244
3345
## 戻り値
@@ -89,7 +101,7 @@ int main() {
89101
memcpy(buf + pos, word.data(), word.size()); // Good: データコピーのみ
90102
pos += word.size();
91103
}
92-
return pos;
104+
return pos; // サイズを返す
93105
});
94106
95107
std::cout << s.size() << ": " << s << std::endl;

0 commit comments

Comments
 (0)