|
10 | 10 | <!-- last lang caution --> |
11 | 11 |
|
12 | 12 | ## 概要 |
13 | | -C++26では、構造化束縛でタプルを分解する際に、パックで受け取れるようになる。 |
| 13 | +C++26では、構造化束縛でタプルを分解する際に、パックで受け取れるようになる。この記法はテンプレート内でのみ利用できる。 |
14 | 14 |
|
15 | 15 | ```cpp |
16 | 16 | std::tuple<X, Y, Z> f(); |
17 | 17 |
|
18 | | -auto [x, y, z] = f(); // C++23: OK, C++26: OK |
19 | | -auto [...xs] = f(); // C++26: OK. パックxsは長さ3でX, Y, Zが含まれる |
20 | | -auto [x, ...rest] = f(); // C++26: OK. xはX、パックrestは長さ2でYとZが含まれる |
21 | | -auto [x, y, z, ...rest] = f(); // C++26: OK. restは空のパック |
22 | | -auto [x, ...rest, z] = f(); // C++26: OK. xはX、パックrestは長さ1でYに対応、zはZ |
23 | | -auto [...a, ...b] = f(); // NG: 複数のパックは指定できない |
| 18 | +template <class> |
| 19 | +void g() |
| 20 | +{ |
| 21 | + auto [x, y, z] = f(); // C++23: OK, C++26: OK |
| 22 | + auto [...xs] = f(); // C++26: OK. パックxsは長さ3でX, Y, Zが含まれる |
| 23 | + auto [x, ...rest] = f(); // C++26: OK. xはX、パックrestは長さ2でYとZが含まれる |
| 24 | + auto [x, y, z, ...rest] = f(); // C++26: OK. restは空のパック |
| 25 | + auto [x, ...rest, z] = f(); // C++26: OK. xはX、パックrestは長さ1でYに対応、zはZ |
| 26 | + auto [...a, ...b] = f(); // NG: 複数のパックは指定できない |
| 27 | +} |
| 28 | + |
| 29 | +void h() |
| 30 | +{ |
| 31 | + auto [x, y, z] = f(); // C++23: OK, C++26: OK |
| 32 | + auto [...xs] = f(); // NG: テンプレートの外では不適格となる |
| 33 | +} |
24 | 34 | ``` |
25 | 35 |
|
26 | 36 | ### std::apply()の実装改善 |
|
0 commit comments