Skip to content

Commit e9fb3fd

Browse files
committed
C++26 : 「条件式での構造化束縛の使用を許可」を追加 (close #1308)
1 parent ba0267c commit e9fb3fd

File tree

6 files changed

+96
-24
lines changed

6 files changed

+96
-24
lines changed

implementation-status.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@
311311
| P2747R2: [`constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md.nolink) | 定数式の文脈での配置`new`を許可 | | | | |
312312
| P3144R2: [不完全型へのポインタに対する`delete`を不適格とする](/lang/cpp26/deleting_a_pointer_to_an_incomplete_type_should_be_ill-formed.md.nolink) | 未定義動作となる操作をコンパイルエラーとする | 15 | 19 | | |
313313
| P2963R3: [制約式内での畳み込み式の順序付け](/lang/cpp26/ordering_of_constraints_involving_fold_expressions.md.nolink) | 畳み込み式では全体ではなく個別の制約を原子制約式として扱う | | 19 | | |
314-
| P0963R3: [条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md.nolink) | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする | 15 | | | |
314+
| P0963R3: [条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md) | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする | 15 | | | |
315315

316316

317317
各処理系のC++26実装状況ページ:

lang/cpp17/selection_statements_with_initializer.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ if (it != m.end()) { return it->size(); }
214214
## <a id="relative-page" href="#relative-page">関連項目</a>
215215
- [C++20 初期化式をともなう範囲for文](/lang/cpp20/range-based_for_statements_with_initializer.md)
216216
- [C++23 初期化文での型の別名宣言を許可](/lang/cpp23/extend_init_statement_to_allow_alias_declaration.md)
217+
- [C++26 条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md)
217218
218219
219220
## 参照

lang/cpp17/structured_bindings.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ auto { w, {x, y}, z } = f(); // このような、tuple内にあるpairを同時
340340
- [C++20 構造化束縛を拡張して通常の変数宣言のように使用できるようにする](/lang/cpp20/extending_structured_bindings_to_be_more_like_variable_declarations.md)
341341
- [C++20 構造化束縛した変数の参照キャプチャを許可](/lang/cpp20/reference_capture_of_structured_bindings.md)
342342
- [C++26 構造化束縛への属性を許可](/lang/cpp26/attributes_for_structured_bindings.md)
343+
- [C++26 条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md)
343344
344345
345346
## 参照

lang/cpp26.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
3232

3333
| 言語機能 | 説明 |
3434
|----------|------|
35-
| [条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md.nolink) | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする |
35+
| [条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md) | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする |
3636
| [自明な無限ループは未定義動作ではないと規定](/lang/cpp26/trivial_infinite_loops_are_not_undefined_behavior.md.nolink) | 並行プログラムの進行保証などを考慮して無限ループを未定義動作ではないものとする |
3737

3838

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# 条件式での構造化束縛の使用を許可 [P0963R3]
2+
* cpp26[meta cpp]
3+
4+
<!-- start lang caution -->
5+
6+
このページはC++26に採用される見込みの言語機能の変更を解説しています。
7+
8+
のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。
9+
10+
<!-- last lang caution -->
11+
12+
## 概要
13+
C++26では、`if`文、`while`文、`for`文、`switch`文の条件式において構造化束縛を使用できるようになる。
14+
15+
C++23までは、条件分岐文の初期化式で構造化束縛は使用できたが、その場合に条件式を別途指定する必要があった。C++26では構造化束縛した全体が`bool`型に変換可能であれば、条件式として構造化束縛を使用できるようになった。
16+
17+
```
18+
// C++23
19+
if (auto [to, ec] = std::to_chars(p, last, 42); ec == std::errc{}) {
20+
auto s = std::string(p, to);
21+
22+
}
23+
24+
// C++26
25+
// std::to_charsの戻り値型であるstd::to_chars_resultは、
26+
// boolへの変換演算子をもつ
27+
if (auto [to, ec] = std::to_chars(p, last, 42)) {
28+
auto s = std::string(p, to);
29+
30+
}
31+
```
32+
* std::to_chars[link /reference/charconv/to_chars.md]
33+
* std::to_chars_result[link /reference/charconv/to_chars_result.md]
34+
* std::errc[link /reference/system_error/errc.md]
35+
* std::to_string[link /reference/string/to_string.md]
36+
37+
なお、条件分岐文での初期化式と、全体を`bool`変換する条件式は別で指定できる。
38+
39+
```cpp
40+
#include <print>
41+
#include <charconv>
42+
#include <string_view>
43+
44+
int f() { return 123; }
45+
46+
int main()
47+
{
48+
char out[50]{};
49+
auto begin = std::begin(out);
50+
auto end = std::end(out);
51+
52+
if (int value = f(); auto [ptr, ec] = std::to_chars(begin, end, value)) {
53+
std::println("{}", std::string_view(begin, ptr - begin));
54+
}
55+
else {
56+
std::println("conversion failed.");
57+
}
58+
}
59+
```
60+
* std::to_chars[link /reference/charconv/to_chars.md]
61+
62+
## <a id="relative-page" href="#relative-page">関連項目</a>
63+
- [C++17 構造化束縛](/lang/cpp17/structured_bindings.md)
64+
- [C++17 `if`文と`switch`文の条件式と初期化を分離](/lang/cpp17/selection_statements_with_initializer.md)
65+
66+
67+
## 参照
68+
- [P0963R3 Structured binding declaration as a condition](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p0963r3.html)

reference/charconv/to_chars.md

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ int main()
213213
std::cout << "conversion failed." << std::endl;
214214
}
215215
216-
//リウヴィル数
216+
//リウヴィル数
217217
constexpr double l = 0.11000100000000000000000100000000000;
218218
219219
//(3) 精度・フォーマット指定なしの浮動小数点数変換
@@ -299,77 +299,77 @@ int main()
299299
auto end = std::end(out);
300300

301301
//(1) 10進数文字列へ変換
302-
if (auto result = std::to_chars(begin, end, 10)) {
303-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
302+
if (auto [ptr, ec] = std::to_chars(begin, end, 10)) {
303+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
304304
}
305305
else {
306306
std::cout << "conversion failed." << std::endl;
307307
}
308308
//(1) 2進数文字列へ変換
309-
if (auto result = std::to_chars(begin, end, 65535, 2)) {
310-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
309+
if (auto [ptr, ec] = std::to_chars(begin, end, 65535, 2)) {
310+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
311311
}
312312
else {
313313
std::cout << "conversion failed." << std::endl;
314314
}
315315
//(1) 36進数文字列へ変換
316-
if (auto result = std::to_chars(begin, end, 35, 36)) {
317-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
316+
if (auto [ptr, ec] = std::to_chars(begin, end, 35, 36)) {
317+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
318318
}
319319
else {
320320
std::cout << "conversion failed." << std::endl;
321321
}
322322

323-
//リウヴィル数
323+
//リウヴィル数
324324
constexpr double l = 0.11000100000000000000000100000000000;
325325

326326
//(3) 精度・フォーマット指定なしの浮動小数点数変換
327-
if (auto result = std::to_chars(begin, end, l)) {
328-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
327+
if (auto [ptr, ec] = std::to_chars(begin, end, l)) {
328+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
329329
}
330330
else {
331331
std::cout << "conversion failed." << std::endl;
332332
}
333333

334334
//(7) 精度指定なしの浮動小数点数変換、指数表記
335-
if (auto result = std::to_chars(begin, end, l, std::chars_format::scientific)) {
336-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
335+
if (auto [ptr, ec] = std::to_chars(begin, end, l, std::chars_format::scientific)) {
336+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
337337
}
338338
else {
339339
std::cout << "conversion failed." << std::endl;
340340
}
341341
//(7) 精度指定なしの浮動小数点数変換、固定小数表記
342-
if (auto result = std::to_chars(begin, end, l, std::chars_format::fixed)) {
343-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
342+
if (auto [ptr, ec] = std::to_chars(begin, end, l, std::chars_format::fixed)) {
343+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
344344
}
345345
else {
346346
std::cout << "conversion failed." << std::endl;
347347
}
348348
//(7) 精度指定なしの浮動小数点数変換、16進指数表記
349-
if (auto result = std::to_chars(begin, end, l, std::chars_format::hex)) {
350-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
349+
if (auto [ptr, ec] = std::to_chars(begin, end, l, std::chars_format::hex)) {
350+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
351351
}
352352
else {
353353
std::cout << "conversion failed." << std::endl;
354354
}
355355

356356
//(11) 精度指定ありの浮動小数点数変換、指数表記
357-
if (auto result = std::to_chars(begin, end, l, std::chars_format::scientific, 16)) {
358-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
357+
if (auto [ptr, ec] = std::to_chars(begin, end, l, std::chars_format::scientific, 16)) {
358+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
359359
}
360360
else {
361361
std::cout << "conversion failed." << std::endl;
362362
}
363363
//(11) 精度指定ありの浮動小数点数変換、固定小数表記
364-
if (auto result = std::to_chars(begin, end, l, std::chars_format::fixed, 16)) {
365-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
364+
if (auto [ptr, ec] = std::to_chars(begin, end, l, std::chars_format::fixed, 16)) {
365+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
366366
}
367367
else {
368368
std::cout << "conversion failed." << std::endl;
369369
}
370370
//(11) 精度指定ありの浮動小数点数変換、16進指数表記
371-
if (auto result = std::to_chars(begin, end, l, std::chars_format::hex, 16)) {
372-
std::cout << std::string_view(begin, result.ptr - begin) << std::endl;
371+
if (auto [ptr, ec] = std::to_chars(begin, end, l, std::chars_format::hex, 16)) {
372+
std::cout << std::string_view(begin, ptr - begin) << std::endl;
373373
}
374374
else {
375375
std::cout << "conversion failed." << std::endl;
@@ -404,6 +404,8 @@ z
404404
- [`chars_format`](../charconv/chars_format.md)
405405
- [`to_chars_result`](../charconv/to_chars_result.md)
406406
- [`from_chars`](../charconv/from_chars.md)
407+
- [C++26 条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md)
408+
407409

408410
## 参照
409411
- [P0067R5: Elementary string conversions, revision 5](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0067r5.html)

0 commit comments

Comments
 (0)