Skip to content

Commit 76555be

Browse files
committed
cpp26/structured_bindings_can_introduce_a_pack: テンプレート内でのみ有効 (#1376)
1 parent 6a106bd commit 76555be

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

lang/cpp26/structured_bindings_can_introduce_a_pack.md

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,27 @@
1010
<!-- last lang caution -->
1111

1212
## 概要
13-
C++26では、構造化束縛でタプルを分解する際に、パックで受け取れるようになる。
13+
C++26では、構造化束縛でタプルを分解する際に、パックで受け取れるようになる。この記法はテンプレート内でのみ利用できる。
1414

1515
```cpp
1616
std::tuple<X, Y, Z> f();
1717

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+
}
2434
```
2535

2636
### std::apply()の実装改善

0 commit comments

Comments
 (0)