6868
6969 </ head >
7070 < body >
71- < header data-kunai-mdinfo ="{"meta": {"header": ["type_traits"], "id-type": ["class template"], "namespace": ["std"], "cpp": ["cpp23"]}, "sources": [{"id": "3d654199c0ffb6163d27701559b999171b324ac2", "source": "#include <iostream>\n\nstruct S {\n S() { std::cout << \"S construct\" << std::endl; }\n ~S() { std::cout << \"S destruct\" << std::endl; }\n};\n\nS&& f() { return S{}; }\n\nint main() {\n std::cout << \"1\" << 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&& s(f());\n\n std::cout << \"2\" << std::endl;\n}\n"}, {"id": "4926b39c189d0e753383ee44bda78e3c1e2970e9", "source": "#include <type_traits>\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<int&&, int>);\n static_assert(std::reference_constructs_from_temporary_v<const int&, int>);\n static_assert(std::reference_constructs_from_temporary_v<A&&, B>);\n static_assert(std::reference_constructs_from_temporary_v<const A&&, B>);\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<int&&, long>);\n static_assert(std::reference_constructs_from_temporary_v<int&&, long&>);\n static_assert(std::reference_constructs_from_temporary_v<int&&, long&&>);\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<A&&, C>);\n static_assert(std::reference_constructs_from_temporary_v<A&&, C&>);\n static_assert(std::reference_constructs_from_temporary_v<A&&, C&&>);\n static_assert(std::reference_constructs_from_temporary_v<A&&, int>);\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<int&, int>);\n static_assert(false == std::reference_constructs_from_temporary_v<int&, int&>);\n static_assert(false == std::reference_constructs_from_temporary_v<int&, int&&>);\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<int&&, int&>);\n static_assert(false == std::reference_constructs_from_temporary_v<int&&, int&&>);\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<B&&, C>);\n static_assert(false == std::reference_constructs_from_temporary_v<B&&, C&>);\n static_assert(false == std::reference_constructs_from_temporary_v<B&&, C&&>);\n static_assert(false == std::reference_constructs_from_temporary_v<B&&, int>);\n}\n\n"}], "page_id": ["reference", "type_traits", "reference_constructs_from_temporary"]} ">
71+ < header data-kunai-mdinfo ="{"meta": {"header": ["type_traits"], "id-type": ["class template"], "namespace": ["std"], "cpp": ["cpp23"]}, "sources": [{"id": "3d654199c0ffb6163d27701559b999171b324ac2", "source": "#include <iostream>\n\nstruct S {\n S() { std::cout << \"S construct\" << std::endl; }\n ~S() { std::cout << \"S destruct\" << std::endl; }\n};\n\nS&& f() { return S{}; }\n\nint main() {\n std::cout << \"1\" << 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&& s(f());\n\n std::cout << \"2\" << std::endl;\n}\n"}, {"id": "aaee72f4467ca41218c903e7be040ffa1c51aa94", "source": "#include <type_traits>\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<int&&, int>);\n static_assert(std::reference_constructs_from_temporary_v<const int&, int>);\n static_assert(std::reference_constructs_from_temporary_v<A&&, B>);\n static_assert(std::reference_constructs_from_temporary_v<const A&&, B>);\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<int&&, long>);\n static_assert(std::reference_constructs_from_temporary_v<int&&, long&>);\n static_assert(std::reference_constructs_from_temporary_v<int&&, long&&>);\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<A&&, C>);\n static_assert(std::reference_constructs_from_temporary_v<A&&, C&>);\n static_assert(std::reference_constructs_from_temporary_v<A&&, C&&>);\n static_assert(std::reference_constructs_from_temporary_v<A&&, int>);\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<B&&, C>);\n static_assert(std::reference_constructs_from_temporary_v<B&&, C&>);\n static_assert(std::reference_constructs_from_temporary_v<B&&, C&&>);\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<int&, int>);\n static_assert(false == std::reference_constructs_from_temporary_v<int&, int&>);\n static_assert(false == std::reference_constructs_from_temporary_v<int&, int&&>);\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<int&&, int&>);\n static_assert(false == std::reference_constructs_from_temporary_v<int&&, int&&>);\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<B&&, int>);\n}\n\n"}], "page_id": ["reference", "type_traits", "reference_constructs_from_temporary"]} ">
7272 < nav class ="navbar navbar-default " role ="navigation ">
7373 < div class ="container-fluid ">
7474 < div class ="navbar-header ">
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 > <U>()</ 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 > << a href ="is_reference.html "> is_reference</ a > <T>, < a href ="is_constructible.html "> is_constructible</ a > <T, U>></ code > が< code > true</ code > かつ、< code > T t(VAL<U>)</ 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 > << a href ="is_reference.html "> is_reference</ a > <T>, < a href ="is_constructible.html "> is_constructible</ a > <T, U>></ code > が< code > true</ code > かつ、< code > T t(VAL<U>); </ 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>
2672672
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 "> <type_traits></ 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 "> <type_traits></ 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 "> <</ span > < span class ="n "> A</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> C</ span > < span class ="o "> &&></ 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 "> <</ span > < span class ="n "> A</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="kt "> int</ span > < span class ="o "> ></ 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 "> <</ span > < span class ="n "> B</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> C</ span > < span class ="o "> ></ 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 "> <</ span > < span class ="n "> B</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> C</ span > < span class ="o "> &></ 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 "> <</ span > < span class ="n "> B</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> C</ span > < span class ="o "> &&></ 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 "> <</ span > < span class ="kt "> int</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="kt "> int</ span > < span class ="o "> &&></ 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 "> <</ span > < span class ="n "> B</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> C</ span > < span class ="o "> ></ 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 "> <</ span > < span class ="n "> B</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> C</ span > < span class ="o "> &></ 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 "> <</ span > < span class ="n "> B</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> C</ span > < span class ="o "> &&></ 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 "> <</ span > < span class ="n "> B</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="p "> );</ span >
321324< span class ="p "> }</ span >
322325</ code > </ pre > </ div >
0 commit comments