@@ -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