Skip to content

Commit 2387fe3

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent 988a6f8 commit 2387fe3

File tree

4 files changed

+95
-1966
lines changed

4 files changed

+95
-1966
lines changed

reference/type_traits/reference_constructs_from_temporary.html

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868

6969
</head>
7070
<body>
71-
<header data-kunai-mdinfo="{&#34;meta&#34;: {&#34;header&#34;: [&#34;type_traits&#34;], &#34;id-type&#34;: [&#34;class template&#34;], &#34;namespace&#34;: [&#34;std&#34;], &#34;cpp&#34;: [&#34;cpp23&#34;]}, &#34;sources&#34;: [{&#34;id&#34;: &#34;3d654199c0ffb6163d27701559b999171b324ac2&#34;, &#34;source&#34;: &#34;#include &lt;iostream&gt;\n\nstruct S {\n S() { std::cout &lt;&lt; \&#34;S construct\&#34; &lt;&lt; std::endl; }\n ~S() { std::cout &lt;&lt; \&#34;S destruct\&#34; &lt;&lt; std::endl; }\n};\n\nS&amp;&amp; f() { return S{}; }\n\nint main() {\n std::cout &lt;&lt; \&#34;1\&#34; &lt;&lt; std::endl;\n\n // f \u306e\u623b\u308a\u5024\u306f s \u306b\u675f\u7e1b\u3055\u308c\u3066\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u305f\u304b\uff1f\n // \u5b9f\u969b\u306b\u306f\u3053\u306e\u5ba3\u8a00\u306e1\u6587\u304c\u7d42\u4e86\u3057\u305f\u969b\u306b f \u306e\u623b\u308a\u5024\u306f\u7834\u68c4\u3055\u308c\u3066\u3044\u308b\n S&amp;&amp; s(f());\n\n std::cout &lt;&lt; \&#34;2\&#34; &lt;&lt; std::endl;\n}\n&#34;}, {&#34;id&#34;: &#34;4926b39c189d0e753383ee44bda78e3c1e2970e9&#34;, &#34;source&#34;: &#34;#include &lt;type_traits&gt;\n\nstruct A {\n A() = default;\n A(int) {}\n};\n\nstruct B : A {\n explicit B(int) {}\n};\n\nstruct C {\n operator struct A() { return A{}; }\n explicit operator struct B() { return B{0}; }\n};\n\nint main()\n{\n // OK: \u308f\u304b\u308a\u3084\u3059\u304f\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u308b\u30bf\u30a4\u30d7\n static_assert(std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, int&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;const int&amp;, int&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, B&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;const A&amp;&amp;, B&gt;);\n\n // OK: \u5909\u63db\u3055\u308c\u3066 rvalue \u306b\u306a\u3063\u3066\u304b\u3089\u675f\u7e1b\u3055\u308c\u3066\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u308b\u30bf\u30a4\u30d7\n static_assert(std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, long&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, long&amp;&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, long&amp;&amp;&gt;);\n\n // OK: explicit \u3067\u306f\u306a\u3044\u306e\u3067\u5909\u63db\u3055\u308c\u3066 rvalue \u306b\u306a\u3063\u3066\u304b\u3089\u675f\u7e1b\u3055\u308c\u3066\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u308b\u30bf\u30a4\u30d7\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, C&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, C&amp;&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, C&amp;&amp;&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, int&gt;);\n\n\n // NG: const \u3067\u306f\u306a\u3044\u5de6\u8fba\u5024\u53c2\u7167\u306f\u5bff\u547d\u3092\u5ef6\u9577\u3057\u306a\u3044\u3093\u3067\u3059\u30bf\u30a4\u30d7\n // 1\u3064\u76ee3\u3064\u76ee\u306f\u305d\u3082\u305d\u3082\u53c2\u7167\u305d\u306e\u3082\u306e\u304c\u69cb\u7bc9\u51fa\u6765\u306a\u3044\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;, int&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;, int&amp;&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;, int&amp;&amp;&gt;);\n\n // NG: \u69cb\u7bc9\u3067\u304d\u306a\u3044\u30d1\u30bf\u30fc\u30f3\u3068\u53f3\u8fba\u5024\u53c2\u7167\u306f\u533a\u5225\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, int&amp;&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, int&amp;&amp;&gt;);\n\n // NG: explicit \u306a\u306e\u3067\u5909\u63db\u51fa\u6765\u305a\u306b\u8a70\u3080\u30d1\u30bf\u30fc\u30f3\n static_assert(false == std::reference_constructs_from_temporary_v&lt;B&amp;&amp;, C&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;B&amp;&amp;, C&amp;&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;B&amp;&amp;, C&amp;&amp;&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;B&amp;&amp;, int&gt;);\n}\n\n&#34;}], &#34;page_id&#34;: [&#34;reference&#34;, &#34;type_traits&#34;, &#34;reference_constructs_from_temporary&#34;]}">
71+
<header data-kunai-mdinfo="{&#34;meta&#34;: {&#34;header&#34;: [&#34;type_traits&#34;], &#34;id-type&#34;: [&#34;class template&#34;], &#34;namespace&#34;: [&#34;std&#34;], &#34;cpp&#34;: [&#34;cpp23&#34;]}, &#34;sources&#34;: [{&#34;id&#34;: &#34;3d654199c0ffb6163d27701559b999171b324ac2&#34;, &#34;source&#34;: &#34;#include &lt;iostream&gt;\n\nstruct S {\n S() { std::cout &lt;&lt; \&#34;S construct\&#34; &lt;&lt; std::endl; }\n ~S() { std::cout &lt;&lt; \&#34;S destruct\&#34; &lt;&lt; std::endl; }\n};\n\nS&amp;&amp; f() { return S{}; }\n\nint main() {\n std::cout &lt;&lt; \&#34;1\&#34; &lt;&lt; std::endl;\n\n // f \u306e\u623b\u308a\u5024\u306f s \u306b\u675f\u7e1b\u3055\u308c\u3066\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u305f\u304b\uff1f\n // \u5b9f\u969b\u306b\u306f\u3053\u306e\u5ba3\u8a00\u306e1\u6587\u304c\u7d42\u4e86\u3057\u305f\u969b\u306b f \u306e\u623b\u308a\u5024\u306f\u7834\u68c4\u3055\u308c\u3066\u3044\u308b\n S&amp;&amp; s(f());\n\n std::cout &lt;&lt; \&#34;2\&#34; &lt;&lt; std::endl;\n}\n&#34;}, {&#34;id&#34;: &#34;aaee72f4467ca41218c903e7be040ffa1c51aa94&#34;, &#34;source&#34;: &#34;#include &lt;type_traits&gt;\n\nstruct A {\n A() = default;\n A(int) {}\n};\n\nstruct B : A {\n explicit B(int) {}\n};\n\nstruct C {\n operator struct A() { return A{}; }\n explicit operator struct B() { return B{0}; }\n};\n\nint main()\n{\n // OK: \u308f\u304b\u308a\u3084\u3059\u304f\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u308b\u30bf\u30a4\u30d7\n static_assert(std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, int&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;const int&amp;, int&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, B&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;const A&amp;&amp;, B&gt;);\n\n // OK: \u5909\u63db\u3055\u308c\u3066 rvalue \u306b\u306a\u3063\u3066\u304b\u3089\u675f\u7e1b\u3055\u308c\u3066\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u308b\u30bf\u30a4\u30d7\n static_assert(std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, long&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, long&amp;&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, long&amp;&amp;&gt;);\n\n // OK: explicit \u3067\u306f\u306a\u3044\u306e\u3067\u5909\u63db\u3055\u308c\u3066 rvalue \u306b\u306a\u3063\u3066\u304b\u3089\u675f\u7e1b\u3055\u308c\u3066\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u308b\u30bf\u30a4\u30d7\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, C&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, C&amp;&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, C&amp;&amp;&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;A&amp;&amp;, int&gt;);\n\n // OK: \u5909\u63db\u3055\u308c\u3066 rvalue \u306b\u306a\u3063\u3066\u304b\u3089\u675f\u7e1b\u3055\u308c\u3066\u5bff\u547d\u304c\u5ef6\u9577\u3055\u308c\u308b\u30bf\u30a4\u30d7\n // C \u2192 B \u306e\u5909\u63db\u306f explicit \u3060\u304c\u3001\u4e38\u30ab\u30c3\u30b3\u521d\u671f\u5316\u306a\u306e\u3067\u5909\u63db\u3067\u304d\u308b\n static_assert(std::reference_constructs_from_temporary_v&lt;B&amp;&amp;, C&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;B&amp;&amp;, C&amp;&gt;);\n static_assert(std::reference_constructs_from_temporary_v&lt;B&amp;&amp;, C&amp;&amp;&gt;);\n\n\n // NG: const \u3067\u306f\u306a\u3044\u5de6\u8fba\u5024\u53c2\u7167\u306f\u5bff\u547d\u3092\u5ef6\u9577\u3057\u306a\u3044\u3093\u3067\u3059\u30bf\u30a4\u30d7\n // 1\u3064\u76ee3\u3064\u76ee\u306f\u305d\u3082\u305d\u3082\u53c2\u7167\u305d\u306e\u3082\u306e\u304c\u69cb\u7bc9\u51fa\u6765\u306a\u3044\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;, int&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;, int&amp;&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;, int&amp;&amp;&gt;);\n\n // NG: \u69cb\u7bc9\u3067\u304d\u306a\u3044\u30d1\u30bf\u30fc\u30f3\u3068\u53f3\u8fba\u5024\u53c2\u7167\u306f\u533a\u5225\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, int&amp;&gt;);\n static_assert(false == std::reference_constructs_from_temporary_v&lt;int&amp;&amp;, int&amp;&amp;&gt;);\n\n // NG: explicit \u306a\u306e\u3067\u5909\u63db\u51fa\u6765\u305a\u306b\u8a70\u3080\u30d1\u30bf\u30fc\u30f3\n static_assert(false == std::reference_constructs_from_temporary_v&lt;B&amp;&amp;, int&gt;);\n}\n\n&#34;}], &#34;page_id&#34;: [&#34;reference&#34;, &#34;type_traits&#34;, &#34;reference_constructs_from_temporary&#34;]}">
7272
<nav class="navbar navbar-default" role="navigation">
7373
<div class="container-fluid">
7474
<div class="navbar-header">
@@ -188,8 +188,8 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(UTC):
191-
<span itemprop="datePublished" content="2025-10-20T07:28:41">
192-
2025年10月20日 07時28分41秒
191+
<span itemprop="datePublished" content="2026-03-23T06:46:05">
192+
2026年03月23日 06時46分05秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -235,7 +235,7 @@ <h2>効果</h2>
235235
<li><code>U</code>が参照型や関数型の場合、<code><a href="../utility/declval.html">declval</a>&lt;U&gt;()</code>と同じ型と値カテゴリを持つ式</li>
236236
<li><code>U</code>が参照型や関数型でない場合、型<code>U</code>である<code>prvalue</code>(ただし、<code>U</code><code>const</code>/<code>volatile</code>修飾があれば調整される)</li>
237237
</ul>
238-
<p><code><a href="conjunction.html">conjunction_v</a>&lt;<a href="is_reference.html">is_reference</a>&lt;T&gt;, <a href="is_constructible.html">is_constructible</a>&lt;T, U&gt;&gt;</code><code>true</code>かつ、<code>T t(VAL&lt;U&gt;)</code>において<code>t</code>が一時オブジェクトの寿命を延長する場合に<code><a href="true_type.html">true_type</a></code>から派生し、そうでなければ<code><a href="false_type.html">false_type</a></code>から派生する。</p>
238+
<p><code><a href="conjunction.html">conjunction_v</a>&lt;<a href="is_reference.html">is_reference</a>&lt;T&gt;, <a href="is_constructible.html">is_constructible</a>&lt;T, U&gt;&gt;</code><code>true</code>かつ、<code>T t(VAL&lt;U&gt;);</code>において<code>t</code>が一時オブジェクトの寿命を延長する場合に<code><a href="true_type.html">true_type</a></code>から派生し、そうでなければ<code><a href="false_type.html">false_type</a></code>から派生する。</p>
239239
<h2>備考</h2>
240240
<p>多くのメタ関数は<code>prvalue</code><code>xvalue</code>を区別しないが、このメタ関数は区別する。例えば、右辺値参照に「<a class="cpprefjp-defined-word" data-desc="関数呼び出し式の評価結果となるオブジェクト・値">戻り値</a>の型が右辺値参照である関数」の<a class="cpprefjp-defined-word" data-desc="関数呼び出し式の評価結果となるオブジェクト・値">戻り値</a>を束縛することを考える。(再現コードは、説明の最後に付す)</p>
241241
<p>この事自体は即座に<a class="cpprefjp-defined-word" data-desc="プログラムが適格でないこと。コンパイルエラーなどになる" href="../../implementation-compliance.html#dfn-ill-formed">不適格</a>とはならない。しかし、その関数が実際には<code>prvalue</code>を返しているとすれば、その<code>prvalue</code><a class="cpprefjp-defined-word" data-desc="関数呼び出し式の評価結果となるオブジェクト・値">戻り値</a>の時点で右辺値参照に束縛されるため、それを右辺値参照に束縛したとしても寿命は延長されることはない。そのため、最終的にダングリング参照を生じることとなる。</p>
@@ -267,7 +267,7 @@ <h3>出力</h3>
267267
2
268268
</code></pre></p>
269269
<h2></h2>
270-
<p><div class="yata" id="4926b39c189d0e753383ee44bda78e3c1e2970e9"><div class="codehilite"><pre><span></span><code><span class="cp">#include <a href="../type_traits.html">&lt;type_traits&gt;</a></span>
270+
<p><div class="yata" id="aaee72f4467ca41218c903e7be040ffa1c51aa94"><div class="codehilite"><pre><span></span><code><span class="cp">#include <a href="../type_traits.html">&lt;type_traits&gt;</a></span>
271271

272272
<span class="k">struct</span><span class="w"> </span><span class="nc">A</span><span class="w"> </span><span class="p">{</span>
273273
<span class="w"> </span><span class="n">A</span><span class="p">()</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">default</span><span class="p">;</span>
@@ -302,6 +302,12 @@ <h2>例</h2>
302302
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">A</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="o">&amp;&amp;&gt;</span><span class="p">);</span>
303303
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">A</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="o">&gt;</span><span class="p">);</span>
304304

305+
<span class="w"> </span><span class="c1">// OK: 変換されて rvalue になってから束縛されて寿命が延長されるタイプ</span>
306+
<span class="w"> </span><span class="c1">// C → B の変換は explicit だが、丸カッコ初期化なので変換できる</span>
307+
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">B</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="o">&gt;</span><span class="p">);</span>
308+
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">B</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="o">&amp;&gt;</span><span class="p">);</span>
309+
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">B</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="o">&amp;&amp;&gt;</span><span class="p">);</span>
310+
305311

306312
<span class="w"> </span><span class="c1">// NG: const ではない左辺値参照は寿命を延長しないんですタイプ</span>
307313
<span class="w"> </span><span class="c1">// 1つ目3つ目はそもそも参照そのものが構築出来ない</span>
@@ -314,9 +320,6 @@ <h2>例</h2>
314320
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="nb">false</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="o">&amp;&amp;&gt;</span><span class="p">);</span>
315321

316322
<span class="w"> </span><span class="c1">// NG: explicit なので変換出来ずに詰むパターン</span>
317-
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="nb">false</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">B</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="o">&gt;</span><span class="p">);</span>
318-
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="nb">false</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">B</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="o">&amp;&gt;</span><span class="p">);</span>
319-
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="nb">false</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">B</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="o">&amp;&amp;&gt;</span><span class="p">);</span>
320323
<span class="w"> </span><span class="k">static_assert</span><span class="p">(</span><span class="nb">false</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">reference_constructs_from_temporary_v</span><span class="o">&lt;</span><span class="n">B</span><span class="o">&amp;&amp;</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="o">&gt;</span><span class="p">);</span>
321324
<span class="p">}</span>
322325
</code></pre></div>

0 commit comments

Comments
 (0)