-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrss.xml
More file actions
797 lines (655 loc) · 46.9 KB
/
rss.xml
File metadata and controls
797 lines (655 loc) · 46.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>cpprefjp - C++日本語リファレンス</title>
<link href="https://cpprefjp.github.io" />
<updated>2026-06-11T17:54:44.451936</updated>
<id>e15c5ab9-f20b-47cf-be8e-85186322e0c4</id>
<entry>
<title>reference -- vector / bitset : C++26でのswap関係の仕様変更に対応 (close #1571)</title>
<link href="https://cpprefjp.github.io/reference/bitset/bitset/reference.html"/>
<id>2846b08f1ab1ee81105ef1152ed2236ae6a63243:reference/bitset/bitset/reference.md</id>
<updated>2026-06-10T16:27:25+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/bitset/bitset/reference.md b/reference/bitset/bitset/reference.md
index 13ff26a29..41f452bcc 100644
--- a/reference/bitset/bitset/reference.md
+++ b/reference/bitset/bitset/reference.md
@@ -16,9 +16,14 @@ namespace std {
CONSTEXPR ~reference() noexcept;
CONSTEXPR reference&amp; operator=(bool x) noexcept;
CONSTEXPR reference&amp; operator=(const reference&amp;) noexcept;
+ constexpr const reference&amp; operator=(bool x) const noexcept; // C++26
CONSTEXPR bool operator~() const noexcept;
CONSTEXPR operator bool() const noexcept;
CONSTEXPR reference&amp; flip() noexcept;
+
+ friend constexpr void swap(reference x, reference y) noexcept; // C++26
+ friend constexpr void swap(reference x, bool&amp; y) noexcept; // C++26
+ friend constexpr void swap(bool&amp; x, reference y) noexcept; // C++26
};
};
}
@@ -30,6 +35,8 @@ namespace std {
C++23から`bitset::reference`全メンバ関数への`constexpr`指定が行われる。
+C++26から、`const`修飾された`*this`に対する`bool`からの代入演算子と、ADLで見つかる非メンバ`swap`関数が追加され、[`vector&lt;bool&gt;::reference`](/reference/vector/vector.md)とインタフェースが統一された。
+
### メンバ関数
@@ -37,11 +44,21 @@ C++23から`bitset::reference`全メンバ関数への`constexpr`指定が行わ
|----------------------------|----------------------------------------------------------|-------|
| `operator=(bool x)` | ビット情報を書き換える | |
| `operator=(const reference&amp;)` | ビット情報をコピーする | |
+| `operator=(bool x) const` | `const`な`*this`のビット情報を書き換える | C++26 |
| `operator~()` | 反転したビットを取得する | |
| `operator bool()` | `bool`型に変換する | |
| `flip()` | ビットを反転させる | |
+### 非メンバ関数
+
+| 名前 | 説明 | 対応バージョン |
+|------|------|----------------|
+| `swap(reference x, reference y)` | 2つの参照先のビットを入れ替える | C++26 |
+| `swap(reference x, bool&amp; y)` | 参照先のビットと`bool`を入れ替える | C++26 |
+| `swap(bool&amp; x, reference y)` | `bool`と参照先のビットを入れ替える | C++26 |
+
+
## 例
```cpp example
#include &lt;cassert&gt;
@@ -75,3 +92,5 @@ int main()
## 参照
- [P2417R2 A more constexpr bitset](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2417r2.pdf)
+- [P3612R1 Harmonize proxy-reference operations (LWG 3638 and 4187)](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3612r1.html)
+ - C++26で、`const`修飾された`*this`に対する`bool`からの代入演算子と、ADLで見つかる非メンバ`swap`関数が追加された
</code></pre></summary>
<author>
<name>Akira Takahashi</name>
<email>faithandbrave@gmail.com</email>
</author>
</entry>
<entry>
<title>vector -- vector / bitset : C++26でのswap関係の仕様変更に対応 (close #1571)</title>
<link href="https://cpprefjp.github.io/reference/vector/vector.html"/>
<id>2846b08f1ab1ee81105ef1152ed2236ae6a63243:reference/vector/vector.md</id>
<updated>2026-06-10T16:27:25+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/vector/vector.md b/reference/vector/vector.md
index 3e9eaa8c8..f8507f358 100644
--- a/reference/vector/vector.md
+++ b/reference/vector/vector.md
@@ -181,6 +181,8 @@ namespace std {
C++23には`vector&lt;bool&gt;::iterator`が出力イテレータとなるために、`vector&lt;bool&gt;::reference`が`const`修飾を持つ`bool`からの代入演算子が追加され、[`indirectly_writable&lt;vector&lt;bool&gt;::iterator,` `bool&gt;`](/reference/iterator/indirectly_writable.md)がモデルを満たすようになった。
+C++26では、ADLで見つかる非メンバ`swap`関数が追加され、[`bitset&lt;N&gt;::reference`](/reference/bitset/bitset/reference.md)とインタフェースが統一された。これにあわせて、従来の`static`メンバ関数版の`swap`は非推奨となった。
+
```cpp
class vector&lt;bool&gt;::reference {
friend class vector;
@@ -193,6 +195,12 @@ public:
constexpr reference&amp; operator=(const reference&amp; x) noexcept; // vector&lt;bool&gt;のビットからの代入
constexpr const reference&amp; operator=(bool x) const noexcept; // *thisがconst時のboolからの代入(C++23)
constexpr void flip() noexcept; // ビットの反転
+
+ friend constexpr void swap(reference x, reference y) noexcept; // 2つのビットの交換(C++26)
+ friend constexpr void swap(reference x, bool&amp; y) noexcept; // ビットとboolの交換(C++26)
+ friend constexpr void swap(bool&amp; x, reference y) noexcept; // boolとビットの交換(C++26)
+
+ static constexpr void swap(reference x, reference y) noexcept; // ビットの交換(C++26から非推奨)
};
```
@@ -447,3 +455,5 @@ int main()
- [N4510 Minimal incomplete type support for standard containers, revision 4](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4510.html)
- [P2286R8 Formatting Ranges](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2286r8.html)
- C++23から、Range・コンテナ、`pair`、`tuple`のフォーマット出力、および文字・文字列のデバッグ指定 (`&#34;?&#34;`) が追加された
+- [P3612R1 Harmonize proxy-reference operations (LWG 3638 and 4187)](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3612r1.html)
+ - C++26で、`vector&lt;bool&gt;::reference`にADLで見つかる非メンバ`swap`関数が追加され、従来の`static`メンバ関数版`swap`が非推奨となった
</code></pre></summary>
<author>
<name>Akira Takahashi</name>
<email>faithandbrave@gmail.com</email>
</author>
</entry>
<entry>
<title>continues_on -- executoin/continue_on: receiver_t置換ミス修正(#1652)</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/continues_on.html"/>
<id>89a5cc01df48e5674500910eebc16ac282e49abb:reference/execution/execution/continues_on.md</id>
<updated>2026-06-09T19:45:18+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/continues_on.md b/reference/execution/execution/continues_on.md
index 4728713af..d4adeedeb 100644
--- a/reference/execution/execution/continues_on.md
+++ b/reference/execution/execution/continues_on.md
@@ -55,9 +55,9 @@ namespace std::execution {
using sched_t = decltype(auto(sch));
using variant_t = see below;
- using receiver_tag = see below;
- using operation_t = connect_result_t&lt;schedule_result_t&lt;sched_t&gt;, receiver_tag&gt;;
- constexpr bool nothrow = noexcept(connect(schedule(sch), receiver_tag{nullptr}));
+ using receiver_t = see below;
+ using operation_t = connect_result_t&lt;schedule_result_t&lt;sched_t&gt;, receiver_t&gt;;
+ constexpr bool nothrow = noexcept(connect(schedule(sch), receiver_t{nullptr}));
struct state-type {
Rcvr&amp; rcvr; // exposition only
@@ -65,7 +65,7 @@ namespace std::execution {
operation_t op-state; // exposition only
explicit state-type(sched_t sch, Rcvr&amp; rcvr) noexcept(nothrow)
- : rcvr(rcvr), op-state(connect(schedule(sch), receiver_tag{this})) {}
+ : rcvr(rcvr), op-state(connect(schedule(sch), receiver_t{this})) {}
};
return state-type{sch, rcvr};
@@ -89,7 +89,7 @@ namespace std::execution {
* variant[link /reference/variant/variant.md]
* monostate[link /reference/variant/monostate.md]
-- `receiver_tag`は説明専用クラス`receiver-type`のエイリアスとする。
+- `receiver_t`は説明専用クラス`receiver-type`のエイリアスとする。
`impls-for&lt;continues_on_t&gt;::complete`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>inline_scheduler -- execution/inline_scheduler: 例示コードを改善</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/inline_scheduler.html"/>
<id>ba2cd8862d3538e6f4c087a006a66411ae678b5d:reference/execution/execution/inline_scheduler.md</id>
<updated>2026-06-09T19:26:15+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/inline_scheduler.md b/reference/execution/execution/inline_scheduler.md
index c2cb4793f..59b40e0e1 100644
--- a/reference/execution/execution/inline_scheduler.md
+++ b/reference/execution/execution/inline_scheduler.md
@@ -74,28 +74,83 @@ struct inline-attrs {
## 例
```cpp example
#include &lt;execution&gt;
+#include &lt;thread&gt;
#include &lt;print&gt;
namespace ex = std::execution;
+// ex::task用のカスタム環境
+struct TaskEnv {
+ using start_scheduler_type = ex::inline_scheduler;
+};
+
+ex::task&lt;void&gt; f(ex::scheduler auto sch)
+{
+ std::println(&#34;step1 main#{}&#34;, std::this_thread::get_id());
+
+ // スケジューラを変更してサブタスクを実行
+ co_await (ex::schedule(sch) | ex::then([]{
+ std::println(&#34;step2 worker#{}&#34;, std::this_thread::get_id());
+ }));
+
+ // デフォルト(task_scheduler)タスクコルーチンのco_await式では、
+ // Scheduler Affinity動作により元のスケジューラ上で処理が継続する。
+ std::println(&#34;step3 main#{}&#34;, std::this_thread::get_id());
+}
+
+ex::task&lt;void, TaskEnv&gt; g(ex::scheduler auto sch)
+{
+ std::println(&#34;step1 main#{}&#34;, std::this_thread::get_id());
+
+ // スケジューラを変更してサブタスクを実行
+ co_await (ex::schedule(sch) | ex::then([]{
+ std::println(&#34;step2 worker#{}&#34;, std::this_thread::get_id());
+ }));
+
+ // inline_schedulerを持つタスクコルーチンのco_await式では、
+ // コルーチンの再開(resume)時に再スケジューリングが行われない。
+ // このためco_await式内で変更したスケジューラが引き継がれる。
+ std::println(&#34;step3 worker#{}&#34;, std::this_thread::get_id());
+}
+
int main()
{
- ex::scheduler auto sch = ex::inline_scheduler{};
+ // ワーカースレッドを開始
+ ex::run_loop loop;
+ std::jthread worker{[&amp;]{
+ loop.run();
+ }};
+ auto sch = loop.get_scheduler();
+
+ std::println(&#34;task_scheduler(default)&#34;);
+ std::this_thread::sync_wait( f(sch) );
+
+ std::println(&#34;inline_scheduler&#34;);
+ std::this_thread::sync_wait( g(sch) );
- std::this_thread::sync_wait(
- ex::schedule(sch)
- | ex::then([]{ std::println(&#34;task&#34;); })
- );
+ loop.finish();
}
```
* ex::inline_scheduler[color ff0000]
+* ex::task[link task.md]
* ex::scheduler[link scheduler.md]
* ex::schedule[link schedule.md]
* ex::then[link then.md]
+* ex::run_loop[link run_loop.md]
+* run()[link run_loop/run.md]
+* get_scheduler()[link run_loop/get_scheduler.md]
+* finish()[link run_loop/finish.md]
* std::this_thread::sync_wait[link ../this_thread/sync_wait.md]
-### 出力
+### 出力例
```
-task
+task_scheduler(default)
+step1 main#124468393588544
+step2 worker#124468391311040
+step3 main#124468393588544
+inline_scheduler
+step1 main#124468393588544
+step2 worker#124468391311040
+step3 worker#124468391311040
```
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>get_domain -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/get_domain.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/get_domain.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/get_domain.md b/reference/execution/execution/get_domain.md
index ad468e281..fa58429cb 100644
--- a/reference/execution/execution/get_domain.md
+++ b/reference/execution/execution/get_domain.md
@@ -22,7 +22,7 @@ namespace std::execution {
部分式`env`に対して、型`D`を下記のうち最初に適格な式の型としたとき、呼び出し式`get_domain(env)`は[`MANDATE-NOTHROW`](MANDATE-NOTHROW.md)`(D())`と等価。
- `auto(`[`AS-CONST`](AS-CONST.md)`(env).query(get_domain))`
-- [`get_completion_domain`](get_completion_domain.md)`&lt;`[`set_value_t`](set_value.md)`&gt;(`[`get_scheduler`](get_scheduler.md)`(env), `[`HIDE-SCHED`](../queryable.md)`(env))`
+- [`get_completion_domain`](get_completion_domain.md)`&lt;`[`set_value_t`](set_value.md)`&gt;(`[`get_scheduler`](get_scheduler.md)`(env),` [`HIDE-SCHED`](../queryable.md)`(env))`
- `env`が評価されることを除いて、[`default_domain()`](default_domain.md)
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>infallible-scheduler -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/infallible-scheduler.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/infallible-scheduler.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/infallible-scheduler.md b/reference/execution/execution/infallible-scheduler.md
index 6a080ddc0..8af9a0b69 100644
--- a/reference/execution/execution/infallible-scheduler.md
+++ b/reference/execution/execution/infallible-scheduler.md
@@ -36,6 +36,7 @@ concept infallible-scheduler =
## 関連項目
- [`execution::scheduler`](scheduler.md)
+- [`execution::affine`](affine.md)
## 参照
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>inline_scheduler -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/inline_scheduler.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/inline_scheduler.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/inline_scheduler.md b/reference/execution/execution/inline_scheduler.md
index a952af0d2..c2cb4793f 100644
--- a/reference/execution/execution/inline_scheduler.md
+++ b/reference/execution/execution/inline_scheduler.md
@@ -29,6 +29,8 @@ namespace std::execution {
[`schedule`](schedule.md)操作により得られる[Sender](sender.md)と[Receiver](receiver.md)を[接続(connect)](connect.md)した[OperationState](operation_state.md)は、[開始(start)](start.md)したスレッド上で即座に[値完了](set_value.md)する。
+戻り値型[`task&lt;T, E&gt;`](task.md)を持つタスクコルーチンのScheduler型として利用すると、コルーチン内で[`co_await`式](/lang/cpp20/coroutines.md)から再開(resume)時のスケジューリング操作を回避できる(動作詳細は[`await_transform`](task/promise_type/await_transform.md)を参照)。
+
## クラス仕様
`inline_scheduler`型の全オブジェクトは等しい。`inline_scheduler`型の部分式`sch`、[クエリオブジェクト](../queryable.md)`q`、部分式のパック`args`としたとき、式`sch.query(q, args...)`は`inline-attrs&lt;`[`set_value_t`](set_value.md)`&gt;.query(q, args...)`と等価な式となる。
@@ -110,6 +112,7 @@ task
## 関連項目
- [`execution::scheduler`](scheduler.md)
+- [`execution::task`](task.md)
## 参照
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>parallel_scheduler -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/parallel_scheduler.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/parallel_scheduler.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/parallel_scheduler.md b/reference/execution/execution/parallel_scheduler.md
index 3331b792c..b75b60726 100644
--- a/reference/execution/execution/parallel_scheduler.md
+++ b/reference/execution/execution/parallel_scheduler.md
@@ -40,7 +40,7 @@ namespace std::execution {
- `r.set_error(e)`は、`e`を[`exception_ptr`](/reference/exception/exception_ptr.md)として、[`set_error`](set_error.md)`(std::move(rcvr), std::move(e))`と同じ効果。
- `r.set_stopped()`は、[`set_stopped`](set_stopped.md)`(std::move(rcvr))`と同じ効果。
-プロキシ`r`に対する事前確保バックエンドストレージ(preallocated backend storage)は、[`span`](/reference/span/span.md)`&lt;`[`byte`](/reference/cstddef/byte.md)`&gt;`型のオブジェクト`s`であり、`r`に対して[`set_value`](set_value.md)/[`set_error`](set_error.md)/[`set_stopped`](set_stopped.md)いずれかが呼び出されるまで範囲`s`は有効かつ上書き可能である。
+プロキシ`r`に対する事前確保バックエンドストレージ(preallocated backend storage)は、[`span`](/reference/span/span.md)`&lt;`[`byte`](/reference/cstddef/byte.md)`&gt;`型のオブジェクト`s`であり、`r`に対して`set_value`/`set_error`/`set_stopped`いずれかが呼び出されるまで範囲`s`は有効かつ上書き可能である。
式[`get_domain`](get_domain.md)`(sch)`は、下記と等価な説明専用の型`parallel-scheduler-domain`の式を返す。
@@ -60,6 +60,8 @@ struct parallel-scheduler-domain {
```
* sender-for[link sender-for.md]
* queryable[link ../queryable.md]
+* bulk_chunked_t[link bulk_chunked.md]
+* bulk_unchunked_t[link bulk_unchunked.md]
* set_value_t[link set_value.md]
上記`transform_sender`の引数`sndr`に対して、説明用の変数`child`, `pol`, `shape`, `f`を下記の通り宣言する。
@@ -80,13 +82,13 @@ auto&amp; [pol, shape, f] = data;
説明用の`b`を`BACKEND-OF(sch)`、`sndr`を[`schedule`](schedule.md)`(sch)`が返すオブジェクト、`rcvr`を[Receiver](receiver.md)とする。`rcvr`が`sndr`に[接続(connect)](connect.md)され、結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、
- `sndr`が値完了するならば、[`b.schedule`](parallel_scheduler_replacement/parallel_scheduler_backend/schedule.md)`(r, s)`が呼ばれる。このとき、
- - `r`は基底[`parallel_scheduler_replacement::receiver_proxy`](parallel_scheduler_replacement/receiver_proxy.md)を持つ`rcvr`のプロキシであり、かつ
+ - `r`は基底クラス[`parallel_scheduler_replacement::receiver_proxy`](parallel_scheduler_replacement/receiver_proxy.md)を持つ`rcvr`のプロキシであり、かつ
- `s`は`r`に対する事前確保バックエンドストレージである。
- 他の全ての完了操作は、変更なしに転送される。
### `bulk_chunked`アルゴリズム
-タグ`bulk_chunked`と[Sender](sender.md)を受け付ける`transform_sender`オーバーロードは、[Receiver](receiver.md)`rcvr`と[接続(connect)](connect.md)され結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、下記動作を行うSenderを返す。
+タグ[`bulk_chunked_t`](bulk_chunked.md)と[Sender](sender.md)を受け付ける`transform_sender`オーバーロードは、[Receiver](receiver.md)`rcvr`と[接続(connect)](connect.md)され結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、下記動作を行うSenderを返す。
- `child`が値`vals`で値完了するならば、`args`を`vals`を指す左辺値式のパックとして、[`b.schedule_bulk_chunked`](parallel_scheduler_replacement/parallel_scheduler_backend/schedule_bulk_chunked.md)`(p ? shape : 1, r, s)`が呼ばれる。このとき、
- `r`は基底クラス[`parallel_scheduler_replacement::bulk_item_receiver_proxy`](parallel_scheduler_replacement/bulk_item_receiver_proxy.md)を持つ`rcvr`のプロキシであり、インデックス`i`, `j`に対して`r.execute(i, j)`は`p`が`true`のとき`f(i, j, args...)`、そうでないときは`f(0, shape, args...)`と等価な効果を持つ。かつ
@@ -95,7 +97,7 @@ auto&amp; [pol, shape, f] = data;
### `bulk_unchunked`アルゴリズム
-タグ`bulk_unchunked`と[Sender](sender.md)を受け付ける`transform_sender`オーバーロードは、[Receiver](receiver.md)`rcvr`と[接続(connect)](connect.md)され結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、下記動作を行うSenderを返す。
+タグ[`bulk_unchunked_t`](bulk_unchunked.md)と[Sender](sender.md)を受け付ける`transform_sender`オーバーロードは、[Receiver](receiver.md)`rcvr`と[接続(connect)](connect.md)され結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、下記動作を行うSenderを返す。
- `child`が値`vals`で値完了するならば、`args`を`vals`を指す左辺値式のパックとして、[`b.schedule_bulk_unchunked`](parallel_scheduler_replacement/parallel_scheduler_backend/schedule_bulk_unchunked.md)`(p ? shape : 1, r, s)`が呼ばれる。このとき、
- `r`は基底クラス[`parallel_scheduler_replacement::bulk_item_receiver_proxy`](parallel_scheduler_replacement/bulk_item_receiver_proxy.md)を持つ`rcvr`のプロキシであり、インデックス`i`に対して`r.execute(i, i + 1)`は`p`が`true`のとき`f(i, args...)`、そうでないときは`for (decltype(shape) i = 0; i &lt; shape; i++) { f(i, args...); }`と等価な効果を持つ。かつ
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>await_transform -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/task/promise_type/await_transform.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/task/promise_type/await_transform.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/task/promise_type/await_transform.md b/reference/execution/execution/task/promise_type/await_transform.md
index afc1af070..27419a3cc 100644
--- a/reference/execution/execution/task/promise_type/await_transform.md
+++ b/reference/execution/execution/task/promise_type/await_transform.md
@@ -7,7 +7,7 @@
```cpp
template&lt;sender Sender&gt;
-auto await_transform(Sender&amp;&amp; sndr); // (1)
+auto await_transform(Sender&amp;&amp; sndr);
```
* sender[link ../../sender.md]
@@ -17,8 +17,8 @@ auto await_transform(Sender&amp;&amp; sndr); // (1)
## 効果
-[`same_as`](/reference/concepts/same_as.md)`&lt;`[`inline_scheduler`](../../inline_scheduler.md)`,` [`start_scheduler_type`](../../task.md)`&gt; == true`ならば、[`as_awaitable`](../../as_awaitable.md)`(std::forward&lt;Sender&gt;(sndr), *this)`を返す。
-そうでなければ、[`as_awaitable`](../../as_awaitable.md)`(`[`affine`](../../affine.md)`(std::forward&lt;Sender&gt;(sndr)), *this)`を返す。
+[`same_as`](/reference/concepts/same_as.md)`&lt;`[`inline_scheduler`](../../inline_scheduler.md)`,` [`start_scheduler_type`](../../task.md)`&gt; == true`ならば、[`as_awaitable`](../../as_awaitable.md)`(`[`std::forward`](/reference/utility/forward.md)`&lt;Sender&gt;(sndr), *this)`を返す。
+そうでなければ、[`as_awaitable`](../../as_awaitable.md)`(`[`affine`](../../affine.md)`(`[`std::forward`](/reference/utility/forward.md)`&lt;Sender&gt;(sndr)), *this)`を返す。
## バージョン
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>operator new -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/task/promise_type/op_new.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/task/promise_type/op_new.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/task/promise_type/op_new.md b/reference/execution/execution/task/promise_type/op_new.md
index a87c818f6..51bb3a4fb 100644
--- a/reference/execution/execution/task/promise_type/op_new.md
+++ b/reference/execution/execution/task/promise_type/op_new.md
@@ -14,6 +14,7 @@ void* operator new(size_t size, const Args&amp;... args); // (2)
template&lt;class This, class Alloc, class... Args&gt;
void* operator new(size_t size, const This&amp;, allocator_arg_t, Alloc alloc, Args&amp;&amp;...); // (3)
```
+* allocator_arg_t[link /reference/memory/allocator_arg_t.md]
## 概要
[`task::promise_type`](../promise_type.md)クラスのnew演算子オーバーロード。
@@ -26,14 +27,20 @@ void* operator new(size_t size, const This&amp;, allocator_arg_t, Alloc alloc, Args&amp;
## 効果
+- (1) : 下記と等価
+
+ ```cpp
+ return operator new(size, allocator_arg, allocator_type());
+ ```
+ * allocator_arg[link /reference/memory/allocator_arg_t.md]
+
- (2), (3) :
- `PAlloc`型のアロケータ`palloc`を`alloc`で初期化する。
- サイズ`size`のコルーチンステートに十分なストレージとなる`U`の最小配列ストレージ、および[`operator delete`](op_delete.md)が後で`palloc`と等しいアロケータでこのメモリブロックを解放するのに必要となる未規定の追加ストレージの確保に`palloc`を用いる。
## 戻り値
-- (1) : `operator new(size,` [`allocator_arg`](/reference/memory/allocator_arg_t.md)`, allocator_type())`
-- (2), (3) : 確保したストレージへのポインタ
+確保したストレージへのポインタ
## バージョン
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>state -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/task/state.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/task/state.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/task/state.md b/reference/execution/execution/task/state.md
index 08d9dacc7..d0001546c 100644
--- a/reference/execution/execution/task/state.md
+++ b/reference/execution/execution/task/state.md
@@ -91,7 +91,7 @@ void start() &amp; noexcept;
stop_token_type get-stop-token();
```
-- 効果 : [`same_as`](/reference/concepts/same_as.md)`&lt;decltype(declval&lt;`[`stop_source_type`](../task.md)`&gt;().get_token()), decltype(`[`get_stop_token`](../../get_stop_token.md)`(get_env(rcvr)))&gt;`が`true`のとき、`get_stop_token(get_env(rcvr))`を返す。そうではなく、`source.`[`has_value()`](/reference/optional/optional/has_value.md)が`false`のとき、下記の値で`source`を初期化する。
+- 効果 : [`same_as`](/reference/concepts/same_as.md)`&lt;decltype(declval&lt;`[`stop_source_type`](../task.md)`&gt;().get_token()), decltype(`[`get_stop_token`](../../get_stop_token.md)`(`[`get_env`](../get_env.md)`(rcvr)))&gt;`が`true`のとき、`get_stop_token(get_env(rcvr))`を返す。そうではなく、`source.`[`has_value()`](/reference/optional/optional/has_value.md)が`false`のとき、下記の値で`source`を初期化する。
- `source-&gt;stop_requested()`は`get_stop_token(get_env(rcvr))-&gt;stop_requested()`を返し、かつ
- `source-&gt;stop_possible()`は`get_stop_token(get_env(rcvr))-&gt;stop_possible()`を返す。
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>task_scheduler -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/task_scheduler.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/task_scheduler.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/task_scheduler.md b/reference/execution/execution/task_scheduler.md
index 0c1bf4c10..a85f7c746 100644
--- a/reference/execution/execution/task_scheduler.md
+++ b/reference/execution/execution/task_scheduler.md
@@ -17,7 +17,9 @@ namespace std::execution {
## クラス仕様
-`task_scheduler`は[`scheduler`](scheduler.md)のモデルである。`task_scheduler`型のオブジェクト`s`に対して、`SCHED(s)`を`s.sch_`が所有するポインタが指すオブジェクトとする。式[`get_forward_progress_guarantee`](get_forward_progress_guarantee.md)`(s)`は`get_forward_progress_guarantee(SCHED(s))`と等価。式[`get_completion_domain`](get_completion_domain.md)`&lt;`[`set_value_t`](set_value.md)`&gt;(s)`は`task_scheduler::`[`ts-domain()`](task_scheduler/schedule.md)と等価。
+`task_scheduler`は[`scheduler`](scheduler.md)のモデルである。
+
+`task_scheduler`型のオブジェクト`s`に対して、`SCHED(s)`を`s.sch_`が所有するポインタが指すオブジェクトとする。式[`get_forward_progress_guarantee`](get_forward_progress_guarantee.md)`(s)`は`get_forward_progress_guarantee(SCHED(s))`と等価。式[`get_completion_domain`](get_completion_domain.md)`&lt;`[`set_value_t`](set_value.md)`&gt;(s)`は`task_scheduler::`[`ts-domain()`](task_scheduler/schedule.md)と等価。
`task_scheduler`クラスは、下記の説明専用メンバ変数を持つ。
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>コンストラクタ -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/task_scheduler/op_constructor.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/task_scheduler/op_constructor.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/task_scheduler/op_constructor.md b/reference/execution/execution/task_scheduler/op_constructor.md
index d9faba92f..54b7ada3a 100644
--- a/reference/execution/execution/task_scheduler/op_constructor.md
+++ b/reference/execution/execution/task_scheduler/op_constructor.md
@@ -14,6 +14,7 @@ task_scheduler(const task_scheduler&amp;) = default; // (2)
```
* task_scheduler[link ../task_scheduler.md]
* scheduler[link ../scheduler.md]
+* allocator[link /reference/memory/allocator.md]
## 概要
- (1) : [Scheduler](../scheduler.md)`sch`とアロケータ`alloc`を保持する`task_scheduler`オブジェクトを構築する。
@@ -45,10 +46,6 @@ task_scheduler(const task_scheduler&amp;) = default; // (2)
- [Visual C++](/implementation.md#visual_cpp): ??
-## 関連項目
-- [`execution::scheduler`](../scheduler.md)
-
-
## 参照
- [P3552R3 Add a Coroutine Task Type](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3552r3.html)
- [LWG4445. `sch_` must not be in moved-from state](https://cplusplus.github.io/LWG/issue4445)
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>schedule -- execution: 説明増補,表現調整など</title>
<link href="https://cpprefjp.github.io/reference/execution/execution/task_scheduler/schedule.html"/>
<id>a86c4d8aa39a90cf69e73b90e8fd98df886baea5:reference/execution/execution/task_scheduler/schedule.md</id>
<updated>2026-06-09T16:03:31+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/execution/execution/task_scheduler/schedule.md b/reference/execution/execution/task_scheduler/schedule.md
index f1fa0312a..1f00dc925 100644
--- a/reference/execution/execution/task_scheduler/schedule.md
+++ b/reference/execution/execution/task_scheduler/schedule.md
@@ -14,13 +14,13 @@ see below schedule();
## 戻り値
-その型が[`sender`](../sender.md)のモデルであり、下記を満たす`ts-sndr`の右辺値。
+その型が[`sender`](../sender.md)のモデルであり、下記を満たす右辺値`ts-sndr`。
- [`get_completion_scheduler`](../get_completion_scheduler.md)`&lt;`[`set_value_t`](../set_value.md)`&gt;(`[`get_env`](../get_env.md)`(ts-sndr))`が`*this`と等しい。
-- [`get_completion_domain`](../get_completion_domain.md)`&lt;`[`set_value_t`](../set_value.md)`&gt;(`[`get_env`](../get_env.md)`(ts-sndr))`が`ts-domain()`と等価な式。
-- [Receiver](../receiver.md)`rcvr`が`ts-sndr`に接続され、結果の[Opearation State](../operation_state.md)が開始されるとき、次の値で`sch_-&gt;schedule(r, s)`を呼び出す。
- - `r`は基底[`parallel_scheduler_replacement::receiver_proxy`](../parallel_scheduler_replacement/receiver_proxy.md)を持つ`rcvr`のプロキシであり、かつ
- - `s`は`r`に対する事前確保バックエンドストレージである。
+- [`get_completion_domain`](../get_completion_domain.md)`&lt;`[`set_value_t`](../set_value.md)`&gt;(`[`get_env`](../get_env.md)`(ts-sndr))`が`ts-domain()`と等価な式である。
+- [Receiver](../receiver.md)`rcvr`が`ts-sndr`に接続され、結果の[Opearation State](../operation_state.md)が開始されるとき、次の値で`sch_-&gt;`[`schedule`](../parallel_scheduler_replacement/parallel_scheduler_backend/schedule.md)`(r, s)`を呼び出す。
+ - `r`は基底クラス[`parallel_scheduler_replacement::receiver_proxy`](../parallel_scheduler_replacement/receiver_proxy.md)を持つ`rcvr`のプロキシであり、かつ
+ - `s`は`r`に対する[事前確保バックエンドストレージ](../parallel_scheduler.md)である。
- 任意の型`E`に対して、[`unstoppable_token`](/reference/stop_token/unstoppable_token.md)`&lt;`[`stop_token_of_t`](../../stop_token_of_t.md)`&lt;E&gt;&gt;`が`true`のとき、[`completion_signatures_of_t`](../completion_signatures_of_t.md)`&lt;decltype(ts-sndr)&gt;, E&gt;`は[`completion_signatures`](../completion_signatures.md)`&lt;`[`set_value_t`](../set_value.md)`()&gt;`を表す。そうでなければ、[`completion_signatures`](../completion_signatures.md)`&lt;`[`set_value_t`](../set_value.md)`(),` [`set_stopped_t`](../set_stopped.md)`()&gt;`を表す。
@@ -52,6 +52,9 @@ namespace std::execution {
* parallel_scheduler_replacement::parallel_scheduler_backend[link ../parallel_scheduler_replacement/parallel_scheduler_backend.md]
* receiver_proxy[link ../parallel_scheduler_replacement/receiver_proxy.md]
* bulk_item_receiver_proxy[link ../parallel_scheduler_replacement/bulk_item_receiver_proxy.md]
+* span[link /reference/span/span.md]
+* byte[link /reference/cstddef/byte.md]
+* std::move[link /reference/utility/move.md]
`env`を部分式のパックとしたとき、値完了シグネチャ[`set_value_t`](../set_value.md)`()`のみを持ち式[`get_completion_scheduler`](../get_completion_scheduler.md)`&lt;set_value_t&gt;(`[`get_env`](../get_env.md)`(just-sndr-like), env...)`が[`get_completion_scheduler`](../get_completion_scheduler.md)`&lt;set_value_t&gt;(sched_, env...)`と等価な式であるような[`Sender`](../sender.md)を`just-sndr-like`とする。
@@ -67,6 +70,8 @@ void schedule_bulk_chunked(size_t shape, bulk_item_receiver_proxy&amp; r,
span&lt;byte&gt; s) noexcept override;
```
* bulk_item_receiver_proxy[link ../parallel_scheduler_replacement/bulk_item_receiver_proxy.md]
+* span[link /reference/span/span.md]
+* byte[link /reference/cstddef/byte.md]
- 効果 : 説明用の`chunk_size`を`shape`以下の整数、`chunk_num`を`(shape + chunk_size - 1) / chunk_size`、`m`を`(i + 1) * chunk_size`と`shape`のうち小さい方として、整数`i`に対して`fn(i)`が`r.execute(i * chunk_sie, m)`を呼び出す関数オブジェクト`fn`とする。下記の式によって[Operation State](../operation_state.md)`os`を構築し、[`start`](../start.md)`(os)`を呼び出す。
@@ -82,6 +87,8 @@ void schedule_bulk_unchunked(size_t shape, bulk_item_receiver_proxy&amp; r,
span&lt;byte&gt; s) noexcept override;
```
* bulk_item_receiver_proxy[link ../parallel_scheduler_replacement/bulk_item_receiver_proxy.md]
+* span[link /reference/span/span.md]
+* byte[link /reference/cstddef/byte.md]
- 効果 : 整数`i`に対して`fn(i)`が`r.execute(i, i + 1)`を呼び出す関数オブジェクト`fn`とする。下記の式によって[Operation State](../operation_state.md)`os`を構築し、[`start`](../start.md)`(os)`を呼び出す。
@@ -119,8 +126,8 @@ static constexpr auto transform_sender(BulkSndr&amp;&amp; bulk_sndr, const Env&amp; env)
- [`sender_in`](../sender_in.md)`&lt;BulkSndr, Env&gt;`が`true`
- 式`auto(`[`std::forward`](/reference/utility/forward.md)`&lt;BulkSndr&gt;(bulk_sndr))`が適格
- 下記のいずれかが`true`
- - `sender-for&lt;BulkSndr,` [`bulk_chunked_t`](../bulk_chunked.md)`&gt;`
- - `sender-for&lt;BulkSndr,` [`bulk_unchunked_t`](../bulk_unchunked.md)`&gt;`
+ - [`sender-for`](../sender-for.md)`&lt;BulkSndr,` [`bulk_chunked_t`](../bulk_chunked.md)`&gt;`
+ - [`sender-for`](../sender-for.md)`&lt;BulkSndr,` [`bulk_unchunked_t`](../bulk_unchunked.md)`&gt;`
- 効果 : 下記と等価
```cpp
auto&amp; [_, data, child] = bulk_sndr;
@@ -140,8 +147,8 @@ static constexpr auto transform_sender(BulkSndr&amp;&amp; bulk_sndr, const Env&amp; env)
`child`が[エラー完了](../set_error.md)もしくは[停止完了](../set_stopped.md)するとき、完了操作は変更されずに`rcvr`に転送される。そうでなければ、値完了結果からdecayコピーされたオブジェクトを指す左辺値式のパック`args`として、
- - `bulk_sndr`が[`bulk_chunked`](../bulk_chunked.md)`(child, policy, shape, fn)`と等価な式またはそのコピーの評価の結果であるとき、`r`を呼び出し可能オブジェクト`fn`と引数`args`を持つ`rcvr`に対するbulk chunkedプロキシ、`s`を`r`の事前確保バックエンドストレージとして、`sch_-&gt;`[`schedule_bulk_chunked`](../parallel_scheduler_replacement/parallel_scheduler_backend/schedule_bulk_chunked.md)`(shape, r, s)`が呼び出される。
- - そうでなければ、`r`を呼び出し可能オブジェクト`fn`と引数`args`を持つ`rcvr`に対するbulk unchunkedプロキシ、`s`を`r`の事前確保バックエンドストレージとして、`sch_-&gt;`[`schedule_bulk_unchunked`](../parallel_scheduler_replacement/parallel_scheduler_backend/schedule_bulk_unchunked.md)`(shape, r, s)`が呼び出される。
+ - `bulk_sndr`が[`bulk_chunked`](../bulk_chunked.md)`(child, policy, shape, fn)`と等価な式またはそのコピーの評価の結果であるとき、`r`を呼び出し可能オブジェクト`fn`と引数`args`を持つ`rcvr`に対するbulk chunkedプロキシ、`s`を`r`の[事前確保バックエンドストレージ](../parallel_scheduler.md)として、`sch_-&gt;`[`schedule_bulk_chunked`](../parallel_scheduler_replacement/parallel_scheduler_backend/schedule_bulk_chunked.md)`(shape, r, s)`が呼び出される。
+ - そうでなければ、`r`を呼び出し可能オブジェクト`fn`と引数`args`を持つ`rcvr`に対するbulk unchunkedプロキシ、`s`を`r`の[事前確保バックエンドストレージ](../parallel_scheduler.md)として、`sch_-&gt;`[`schedule_bulk_unchunked`](../parallel_scheduler_replacement/parallel_scheduler_backend/schedule_bulk_unchunked.md)`(shape, r, s)`が呼び出される。
## バージョン
</code></pre></summary>
<author>
<name>yoh</name>
<email>kawasaki.liamg@gmail.com</email>
</author>
</entry>
<entry>
<title>address -- atomic_ref::address : C++26で戻り値型が`void*`に変更になった (close #1631)</title>
<link href="https://cpprefjp.github.io/reference/atomic/atomic_ref/address.html"/>
<id>4a8f1a40317bb219e8a3aa594955cbef679b762d:reference/atomic/atomic_ref/address.md</id>
<updated>2026-06-09T12:37:47+09:00</updated>
<summary type="html"><pre><code>diff --git a/reference/atomic/atomic_ref/address.md b/reference/atomic/atomic_ref/address.md
index dad2c19b6..9b89555bf 100644
--- a/reference/atomic/atomic_ref/address.md
+++ b/reference/atomic/atomic_ref/address.md
@@ -6,12 +6,15 @@
* cpp26[meta cpp]
```cpp
-constexpr T* address() const noexcept;
+constexpr address-return-type address() const noexcept;
```
+* address-return-type[italic]
## 概要
参照しているオブジェクトのアドレスを取得する。
+戻り値型`address-return-type`は説明専用の型エイリアスであり、`COPYCV(T, void)*`と定義される。`COPYCV(T, void)`は、`T`の最上位のCV修飾を`void`に付加した型である。たとえば`atomic_ref&lt;int&gt;`では`void*`、`atomic_ref&lt;const int&gt;`では`const void*`を返す。
+
### この関数を必要とする状況
#### データ構造の要素へのアトミックアクセス
配列の各要素にアトミックアクセスする際、[`std::atomic`](/reference/atomic/atomic.md)オブジェクトでは以下のように記述する。
@@ -29,7 +32,7 @@ int fetch_add_idx(std::atomic&lt;int&gt;* base, size_t i, int value) {
```cpp
int fetch_add_idx(std::atomic_ref&lt;int&gt; base, size_t i, int value) {
- int* p = base.address();
+ int* p = static_cast&lt;int*&gt;(base.address());
return std::atomic_ref{*(p+i)}.fetch_add(value);
}
```
@@ -41,7 +44,7 @@ int fetch_add_idx(std::atomic_ref&lt;int&gt; base, size_t i, int value) {
```cpp
void thread(atomic_ref&lt;int&gt;* data, atomic_ref&lt;int&gt; counter, int nthreads) {
data-&gt;fetch_add(42, memory_order_relaxed);
- int* d = data-&gt;address(); // dataへの生ポインタを取得
+ int* d = static_cast&lt;int*&gt;(data-&gt;address()); // dataへの生ポインタを取得
data-&gt;~atomic_ref(); // このスレッドのデータへのatomic_refを破棄する
int pos = counter.fetch_add(1); // データの破棄が完了したことを伝える
if (pos != (nthreads - 1))
@@ -55,13 +58,26 @@ void thread(atomic_ref&lt;int&gt;* data, atomic_ref&lt;int&gt; counter, int nthreads) {
## 戻り値
-`*this`が参照するオブジェクトをアドレス値を返す
+`*this`が参照するオブジェクトを指すポインタを、`T`のCV修飾を引き継いだ`void`へのポインタとして返す
## 例外
投げない
+## 備考
+- 戻り値を`void`へのポインタとしているのは、参照先オブジェクトへの不用意なアクセスという誤用を防ぐためである
+ - この関数の主な用途は、ポインタ値そのもの(ハッシュ化や比較、配列のインデックス計算など)を使うことである。一方、参照先のオブジェクトを直接読み書きすると、同じオブジェクトを参照するほかの`atomic_ref`が生存している状況ではデータ競合となる
+ - 仮に戻り値が`T*`であれば、以下のように参照先を何気なく読み書きでき、アトミック性を壊すアクセスに気付きにくいという問題が起きる:
+ ```cpp
+ int x = 0;
+ std::atomic_ref ar{x};
+
+ int* p = ar.address(); // 戻り値型がT*であった場合、
+ int value = *p; // 非アトミックな間接参照が容易にできてしまう
+ ```
+
+
## 例
```cpp example
#include &lt;iostream&gt;
@@ -69,8 +85,8 @@ void thread(atomic_ref&lt;int&gt;* data, atomic_ref&lt;int&gt; counter, int nthreads) {
#include &lt;thread&gt;
void f(std::atomic_ref&lt;int&gt; ar, int i) {
- int* p = ar.address();
- std::atomic_ref{p + i}.fetch_add(1);
+ int* p = static_cast&lt;int*&gt;(ar.address());
+ std::atomic_ref{*(p + i)}.fetch_add(1);
}
int main()
@@ -109,3 +125,5 @@ int main()
## 参照
- [P2835R7 Expose `std::atomic_ref` &#39;s object address](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2835r7.html)
+- [P3936R1 Safer `atomic_ref::address` (FR-030-310)](https://open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3936r1.pdf)
+ - C++26で、誤用を防ぐために戻り値型を`T*`から`COPYCV(T, void)*`(`T`のCV修飾を引き継いだ`void`へのポインタ)に変更した
</code></pre></summary>
<author>
<name>Akira Takahashi</name>
<email>faithandbrave@gmail.com</email>
</author>
</entry>
</feed>