Skip to content

Commit 944e1f0

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent b6f647c commit 944e1f0

26 files changed

+159
-307
lines changed

lang/cpp20/converting_from_pointer_to_bool_should_be_considered_narrowing.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,12 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(UTC):
191-
<span itemprop="datePublished" content="2024-07-08T07:33:21">
192-
2024年07月08日 07時33分21秒
191+
<span itemprop="datePublished" content="2025-05-01T15:54:53">
192+
2025年05月01日 15時54分53秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
196-
<span itemprop="name">Akira Takahashi</span>
196+
<span itemprop="name">yoh</span>
197197
</span>
198198
が更新
199199
</small></p>
@@ -233,22 +233,22 @@ <h2>概要</h2>
233233
<p>これはC++17に対する欠陥報告であるため、実装済みのコンパイラにおいてはC++17モード(-std=c++17を指定した場合など)でコンパイルした場合にも適用される。</p>
234234
<h2>この機能が必要になった背景・経緯</h2>
235235
<p>C++17で導入された<code>std::variant</code>には当初、<code>const char*</code>から<code>bool</code>への暗黙変換によって意図しない構築がなされるバグがあった。</p>
236-
<p><div class="codehilite"><pre><span></span><code><span class="n">std</span><span class="o">::</span><span class="n"><a href="../../reference/variant/variant.html">variant</a></span><span class="o">&lt;</span><span class="n"><a href="../../reference/string/basic_string.html">std::string</a></span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span> <span class="n">x</span> <span class="o">=</span> <span class="s">"abc"</span><span class="p">;</span> <span class="c1">// boolを保持して構築されてしまう</span>
236+
<p><div class="codehilite"><pre><span></span><code><span class="n"><a href="../../reference/variant/variant.html">std::variant</a></span><span class="o">&lt;</span><span class="n"><a href="../../reference/string/basic_string.html">std::string</a></span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span> <span class="n">x</span> <span class="o">=</span> <span class="s">"abc"</span><span class="p">;</span> <span class="c1">// boolを保持して構築されてしまう</span>
237237
</code></pre></div>
238238
</p>
239239
<p>この他にも構築・代入時に縮小変換が行われてしまう事から同様の問題があり、それはC++20において<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0608r3.html" target="_blank">P0608R3</a>によって解決された。そこでは、構築・代入時の縮小変換を禁止するとともに、<code>bool</code>に変換可能な型を<code>bool</code>に変換することを禁止することで問題に対処していた。</p>
240240
<p>しかしそれによって、<code>bool</code>に変換可能な<a class="cpprefjp-defined-word" data-desc="プログラム定義型。標準ライブラリの型を除く、ユーザー(プログラマ)によって定義された型のこと">ユーザー定義型</a><code>bool</code>値として構築・代入することができなくなった。</p>
241241
<p><div class="codehilite"><pre><span></span><code><span class="n"><a href="../../reference/bitset/bitset.html">std::bitset</a></span><span class="o">&lt;</span><span class="mi">4</span><span class="o">&gt;</span> <span class="n">b</span><span class="p">(</span><span class="s">"0101"</span><span class="p">);</span>
242-
<span class="n">std</span><span class="o">::</span><span class="n"><a href="../../reference/variant/variant.html">variant</a></span><span class="o">&lt;</span><span class="kt">bool</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span> <span class="c1">// intを保持して構築されてしまう</span>
242+
<span class="n"><a href="../../reference/variant/variant.html">std::variant</a></span><span class="o">&lt;</span><span class="kt">bool</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span> <span class="c1">// intを保持して構築されてしまう</span>
243243
</code></pre></div>
244244
</p>
245245
<p><code>std::bitset</code>の非<code>const</code><code><a href="../../reference/bitset/bitset/op_at.html">operator[]</a></code><code>bool</code>型へ暗黙変換可能なプロキシオブジェクトを返す。</p>
246246
<p><code>std::variant</code>の構築・代入時に縮小変換が起こることを検出して防止することはライブラリレベルで可能だったが、ポインタ型から<code>bool</code>への変換を縮小変換として扱うということはライブラリレベルでは実装できなかったため<code>bool</code>への変換全体を禁止せざるを得ず、このような問題が発生していた。</p>
247247
<p>これらの問題の解決のために、ポインタ型から<code>bool</code>型への変換は縮小変換であると規定することになった。これによって、<code>std::variant</code>の構築・代入時のポインタ型から<code>bool</code>型への変換は縮小変換の一種として検出され禁止されるようになり、上記のコードは意図どおりに動作するようになる。</p>
248-
<p><div class="codehilite"><pre><span></span><code><span class="n">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="n"><a href="../../reference/string/basic_string.html">std::string</a></span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span> <span class="n">x</span> <span class="o">=</span> <span class="s">"abc"</span><span class="p">;</span> <span class="c1">// <a href="../../reference/string/basic_string.html">std::string</a>を保持して構築</span>
248+
<p><div class="codehilite"><pre><span></span><code><span class="n"><a href="../../reference/variant/variant.html">std::variant</a></span><span class="o">&lt;</span><span class="n"><a href="../../reference/string/basic_string.html">std::string</a></span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span> <span class="n">x</span> <span class="o">=</span> <span class="s">"abc"</span><span class="p">;</span> <span class="c1">// <a href="../../reference/string/basic_string.html">std::string</a>を保持して構築</span>
249249

250250
<span class="n"><a href="../../reference/bitset/bitset.html">std::bitset</a></span><span class="o">&lt;</span><span class="mi">4</span><span class="o">&gt;</span> <span class="n">b</span><span class="p">(</span><span class="s">"0101"</span><span class="p">);</span>
251-
<span class="n">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="kt">bool</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span> <span class="c1">// boolを保持して構築</span>
251+
<span class="n"><a href="../../reference/variant/variant.html">std::variant</a></span><span class="o">&lt;</span><span class="kt">bool</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span> <span class="c1">// boolを保持して構築</span>
252252
</code></pre></div>
253253
</p>
254254
<p><code>{}</code>初期化では縮小変換が禁止されているためこれは破壊的変更となるが、そのような変換は多くの場合バグの可能性が高いこと、MSVCは非リテラルのポインタから<code>bool</code>への変換を縮小変換として扱っていたことなどから、影響は少なくメリットの方が大きいと判断されたようだ。</p>

reference/execution/execution/error_types_of_t.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ <h2>例</h2>
256256
<span class="c1">// エラー完了シグネチャ set_error_t(int)</span>
257257
<span class="n"><a href="sender.html">ex::sender</a></span> <span class="k">auto</span> <span class="n">snd2</span> <span class="o">=</span> <span class="n"><span href="https://cpprefjp.github.io/reference/execution/execution/just_error.md.nolink">ex::just_error</span></span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>
258258
<span class="k">using</span> <span class="n">Types2</span> <span class="o">=</span> <span class="n"><span style="color:#ff0000">ex::error_types_of_t</span></span><span class="o">&lt;</span><span class="k">decltype</span><span class="p">(</span><span class="n">snd2</span><span class="p">)</span><span class="o">&gt;</span><span class="p">;</span>
259-
<span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n"><a href="../../concepts/same_as.html">same_as</a></span><span class="o">&lt;</span><span class="n">Types2</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span><span class="p">);</span>
259+
<span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n"><a href="../../concepts/same_as.html">same_as</a></span><span class="o">&lt;</span><span class="n">Types2</span><span class="p">,</span> <span class="n"><a href="../../variant/variant.html">std::variant</a></span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span><span class="p">);</span>
260260
<span class="p">}</span>
261261
</code></pre></div>
262262
</div></p>

reference/execution/execution/value_types_of_t.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ <h2>例</h2>
253253
<span class="c1">// 値完了シグネチャ set_value_t(int, char)</span>
254254
<span class="n"><a href="sender.html">ex::sender</a></span> <span class="k">auto</span> <span class="n">snd1</span> <span class="o">=</span> <span class="n"><span href="https://cpprefjp.github.io/reference/execution/execution/just.md.nolink">ex::just</span></span><span class="p">(</span><span class="mi">123</span><span class="p">,</span> <span class="sc">'X'</span><span class="p">);</span>
255255
<span class="k">using</span> <span class="n">Types1</span> <span class="o">=</span> <span class="n"><span style="color:#ff0000">ex::value_types_of_t</span></span><span class="o">&lt;</span><span class="k">decltype</span><span class="p">(</span><span class="n">snd1</span><span class="p">)</span><span class="o">&gt;</span><span class="p">;</span>
256-
<span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n"><a href="../../concepts/same_as.html">same_as</a></span><span class="o">&lt;</span><span class="n">Types1</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="n"><a href="../../tuple/tuple.html">std::tuple</a></span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">char</span><span class="o">&gt;&gt;&gt;</span><span class="p">);</span>
256+
<span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n"><a href="../../concepts/same_as.html">same_as</a></span><span class="o">&lt;</span><span class="n">Types1</span><span class="p">,</span> <span class="n"><a href="../../variant/variant.html">std::variant</a></span><span class="o">&lt;</span><span class="n"><a href="../../tuple/tuple.html">std::tuple</a></span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">char</span><span class="o">&gt;&gt;&gt;</span><span class="p">);</span>
257257

258258
<span class="c1">// 値完了シグネチャを持たないSender</span>
259259
<span class="n"><a href="sender.html">ex::sender</a></span> <span class="k">auto</span> <span class="n">snd2</span> <span class="o">=</span> <span class="n"><span href="https://cpprefjp.github.io/reference/execution/execution/just_error.md.nolink">ex::just_error</span></span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>

reference/utility/in_place_index_t.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,12 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(UTC):
191-
<span itemprop="datePublished" content="2024-06-11T13:45:38">
192-
2024年06月11日 13時45分38秒
191+
<span itemprop="datePublished" content="2025-05-01T15:54:53">
192+
2025年05月01日 15時54分53秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
196-
<span itemprop="name">Akira Takahashi</span>
196+
<span itemprop="name">yoh</span>
197197
</span>
198198
が更新
199199
</small></p>

reference/variant/holds_alternative.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ <h2>例</h2>
233233

234234
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
235235
<span class="p">{</span>
236-
<span class="n">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">char</span><span class="p">,</span> <span class="kt">double</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="sc">'a'</span><span class="p">;</span>
236+
<span class="n"><a href="variant.html">std::variant</a></span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">char</span><span class="p">,</span> <span class="kt">double</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="sc">'a'</span><span class="p">;</span>
237237

238238
<span class="k">if</span> <span class="p">(</span><span class="n"><span style="color:#ff0000">std::holds_alternative</span></span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span><span class="p">(</span><span class="n">v</span><span class="p">))</span> <span class="p">{</span>
239239
<span class="n"><a href="../iostream/cout.html">std::cout</a></span> <span class="o">&lt;&lt;</span> <span class="s">"vはchar型を現在保持している"</span> <span class="o">&lt;&lt;</span> <span class="n"><a href="../ostream/endl.html">std::endl</a></span><span class="p">;</span>

reference/variant/variant.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ <h2>概要</h2>
228228
<span class="k">struct</span> <span class="n">C</span> <span class="p">{</span> <span class="kt">void</span> <span class="n">f</span><span class="p">()</span> <span class="p">{}</span> <span class="p">};</span>
229229

230230
<span class="c1">// A, B, Cのいずれかの型を代入できる型</span>
231-
<span class="n">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="n">A</span><span class="p">{};</span> <span class="c1">// A型のオブジェクトを代入</span>
231+
<span class="n"><a href="">std::variant</a></span><span class="o">&lt;</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="n">A</span><span class="p">{};</span> <span class="c1">// A型のオブジェクトを代入</span>
232232
<span class="n">v</span> <span class="o">=</span> <span class="n">B</span><span class="p">{};</span> <span class="c1">// B型のオブジェクトに切り替え</span>
233233

234234
<span class="c1">// B型オブジェクトを保持しているか</span>
@@ -498,7 +498,7 @@ <h2>例</h2>
498498
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
499499
<span class="p">{</span>
500500
<span class="c1">// int, char, <a href="../string/basic_string.html">std::string</a>のいずれかの型の値を保持できる型</span>
501-
<span class="n">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">char</span><span class="p">,</span> <span class="n"><a href="../string/basic_string.html">std::string</a></span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="c1">// int型の値を代入</span>
501+
<span class="n"><a href="">std::variant</a></span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">char</span><span class="p">,</span> <span class="n"><a href="../string/basic_string.html">std::string</a></span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="c1">// int型の値を代入</span>
502502

503503
<span class="c1">// 候補型の0番目の型 (int) を保持しているか</span>
504504
<span class="k">if</span> <span class="p">(</span><span class="n"><a href="variant/index.html">v.index()</a></span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>

0 commit comments

Comments
 (0)