22<feed xmlns =" http://www.w3.org/2005/Atom" >
33 <title >cpprefjp - C++日本語リファレンス</title >
44 <link href =" https://cpprefjp.github.io" />
5- <updated >2026-03-27T06:11:25.606127 </updated >
6- <id >8388eb2f-2bbd-4a0f-99de-bb4fda2a3715 </id >
5+ <updated >2026-03-27T06:27:22.252115 </updated >
6+ <id >2a69506c-f73f-44ba-afb1-c09c9f87ccea </id >
77
88
9+ <entry >
10+ <title >observable_checkpoint -- observable_checkpoint : ルールのカバー状況と動機となる例を記載 #1418</title >
11+ <link href =" https://cpprefjp.github.io/reference/utility/observable_checkpoint.html" />
12+ <id >d8f8beb93575d1d276829c2a84637f33777ed231:reference/utility/observable_checkpoint.md</id >
13+ <updated >2026-03-27T15:23:25+09:00</updated >
14+
15+ <summary type =" html" >< pre>< code> diff --git a/reference/utility/observable_checkpoint.md b/reference/utility/observable_checkpoint.md
16+ index 879bca256..ba08d559b 100644
17+ --- a/reference/utility/observable_checkpoint.md
18+ +++ b/reference/utility/observable_checkpoint.md
19+ @@ -15,16 +15,14 @@ namespace std {
20+
21+ C++では未定義動作を含むプログラムに対して、コンパイラは未定義動作が「将来」発生することを根拠に、それより「前」の操作を削除・変更する最適化を行うことが許容される。これは「タイムトラベル最適化」と呼ばれる。
22+
23+ -例として以下のコードでは、(2)で未定義動作があるため、(1)の出力すら省略される可能性がある:
24+ +例として以下のコードでは、nullポインタが渡された場合にエラーメッセージを出力してからデリファレンスに到達する意図だが、コンパイラは`++*p`が未定義動作にならないと仮定して`p`がnullでないと推論し、`if(!p)`の分岐ごと削除できる。その結果、エラーメッセージが出力されることなくクラッシュする可能性がある:
25+
26+ ```cpp
27+ #include & lt;cstdio& gt;
28+
29+ -int main() {
30+ - std::printf(& #34;Hello, & #34;); // (1) 出力
31+ - int* p = nullptr;
32+ - *p = 42; // (2) 未定義動作(nullポインタのデリファレンス)
33+ - std::printf(& #34;World!\n& #34;); // (3) 出力
34+ +void inc(int* p) {
35+ + if (!p) std::fputs(& #34;Null!\n& #34;, stderr); // (1) エラー出力(削除される可能性がある)
36+ + ++*p; // (2) pがnullなら未定義動作
37+ }
38+ ```
39+
40+ @@ -34,16 +32,14 @@ int main() {
41+ #include & lt;cstdio& gt;
42+ #include & lt;utility& gt;
43+
44+ -int main() {
45+ - std::printf(& #34;Hello, & #34;); // (1) 出力
46+ - std::observable_checkpoint(); // ここまでの観測可能な動作を保護
47+ - int* p = nullptr;
48+ - *p = 42; // (2) 未定義動作
49+ - std::printf(& #34;World!\n& #34;); // (3) 出力
50+ +void inc(int* p) {
51+ + if (!p) std::fputs(& #34;Null!\n& #34;, stderr); // (1) エラー出力
52+ + std::observable_checkpoint(); // ここまでの観測可能な動作を保護
53+ + ++*p; // (2) pがnullなら未定義動作
54+ }
55+ ```
56+
57+ -この場合、`std::observable_checkpoint()`によって(1)の出力`& #34;Hello, & #34;`が保護され、(2)の未定義動作があっても遡って消去されない。
58+ +この場合、`std::observable_checkpoint()`によって(1)のエラー出力が保護され、(2)の未定義動作があっても遡って消去されない。
59+
60+ `std::observable_checkpoint()`の明示的な呼び出しに加え、以下の操作も暗黙的に観測可能チェックポイントを設置する:
61+
62+ @@ -51,6 +47,8 @@ int main() {
63+ - デフォルトの[`sync_with_stdio(true)`](/reference/ios/ios_base/sync_with_stdio.md)の状態では、[`std::cout`](/reference/iostream/cout.md)などの標準ストリームは`stdout`と同期しているため、これに該当する
64+ - [`std::ofstream`](/reference/fstream/basic_ofstream.md)などのファイルストリーム出力時の[`std::basic_filebuf`](/reference/fstream/basic_filebuf.md)のオーバーフロー操作(バッファの内容をファイルに書き出した時点)
65+ - Unicode出力時の[`std::print()`](/reference/print/print.md) / [`std::println()`](/reference/print/println.md)の内部出力関数[`std::vprint_unicode()`](/reference/print/vprint_unicode.md)によるターミナルへの書き込み([`& lt;ostream& gt;`](/reference/ostream.md)版および[`& lt;print& gt;`](/reference/print.md)版)
66+ + - Unicode出力時はネイティブのOS API(Windowsでの`WriteConsoleW()`など)を直接使用しC標準の入出力を経由しないため、このルールで明示的にカバーしている
67+ + - 非Unicode出力時はC標準I/O関数を経由するため、上記のC標準入出力関数のルールでカバーされる
68+
69+ 上記の例では`std::printf()`がC標準の入出力関数であるため、(1)の呼び出しの復帰が暗黙の観測可能チェックポイントとなり、`& #34;Hello, & #34;`の出力は(2)の未定義動作によって遡って消去されない。
70+
71+ < /code>< /pre> </summary >
72+
73+ <author >
74+ <name >Akira Takahashi</name >
75+ <email >faithandbrave@gmail.com</email >
76+ </author >
77+ </entry >
78+
979 <entry >
1080 <title >observable_checkpoint -- observable_checkpoint : coutやfstreamの扱いを記載 #1418</title >
1181 <link href =" https://cpprefjp.github.io/reference/utility/observable_checkpoint.html" />
@@ -2477,30 +2547,4 @@ index 555ecf243..6f868b151 100644
24772547 </author >
24782548 </entry >
24792549
2480- <entry >
2481- <title >comp-name -- text_encoding::comp-name : meta exposition-only タグを追加</title >
2482- <link href =" https://cpprefjp.github.io/reference/text_encoding/text_encoding/comp-name.html" />
2483- <id >c08dfb5dce7d73795d1858dbc71a964b668e0c3c:reference/text_encoding/text_encoding/comp-name.md</id >
2484- <updated >2026-03-26T13:51:34+09:00</updated >
2485-
2486- <summary type =" html" >< pre>< code> diff --git a/reference/text_encoding/text_encoding/comp-name.md b/reference/text_encoding/text_encoding/comp-name.md
2487- index 1a3b13317..4d55a9da0 100644
2488- --- a/reference/text_encoding/text_encoding/comp-name.md
2489- +++ b/reference/text_encoding/text_encoding/comp-name.md
2490- @@ -4,6 +4,7 @@
2491- * text_encoding[meta class]
2492- * function[meta id-type]
2493- * cpp26[meta cpp]
2494- +* [meta exposition-only]
2495-
2496- ```cpp
2497- static constexpr bool comp-name(string_view a, string_view b); // 説明専用
2498- < /code>< /pre> </summary >
2499-
2500- <author >
2501- <name >Raclamusi</name >
2502- <email >raclamusi@gmail.com</email >
2503- </author >
2504- </entry >
2505-
25062550</feed >
0 commit comments