6868
6969 </ head >
7070 < body >
71- < header data-kunai-mdinfo ="{"meta": {"header": ["string"], "namespace": ["std"], "id-type": ["function template"]}, "sources": [{"id": "5a5b944643b7eb709ec1dc76bdaf86231a131e33", "source": "#include <iostream>\n#include <string>\n\nint main()\n{\n std::string s1(\"Hell\");\n std::string s2(\"world\");\n\n std::string s3 = s1 + 'o' + \", \" + s2 + '!';\n\n std::cout << s3 << '\\n';\n}\n"}], "page_id": ["reference", "string", "basic_string", "op_plus"]} ">
71+ < header data-kunai-mdinfo ="{"meta": {"header": ["string"], "namespace": ["std"], "id-type": ["function template"]}, "sources": [{"id": "5a5b944643b7eb709ec1dc76bdaf86231a131e33", "source": "#include <iostream>\n#include <string>\n\nint main()\n{\n std::string s1(\"Hell\");\n std::string s2(\"world\");\n\n std::string s3 = s1 + 'o' + \", \" + s2 + '!';\n\n std::cout << s3 << '\\n';\n}\n"}, {"id": "140d8b7a3041e4dc85e9f9f24b88f3060d371279", "source": "#include <iostream>\n#include <string>\n#include <string_view>\n\nint main()\n{\n std::string s = \"Hello\";\n std::string_view sv = \", World!\";\n\n // string + string_view (13)\n std::string result1 = s + sv;\n std::cout << result1 << '\\n';\n\n // string&& + string_view (14)\n std::string result2 = std::string(\"Hello\") + sv;\n std::cout << result2 << '\\n';\n}\n"}], "page_id": ["reference", "string", "basic_string", "op_plus"]} ">
7272 < nav class ="navbar navbar-default " role ="navigation ">
7373 < div class ="container-fluid ">
7474 < div class ="navbar-header ">
200200
201201 < p class ="text-right "> < small >
202202 最終更新日時(UTC):
203- < span itemprop ="datePublished " content ="2025-05-23T01:33:50 ">
204- 2025年05月23日 01時33分50秒
203+ < span itemprop ="datePublished " content ="2026-03-11T04:40:57 ">
204+ 2026年03月11日 04時40分57秒
205205 </ span >
206206 < br />
207207 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
334334< span class ="w "> </ span > < span class ="k "> constexpr</ span > < span class ="w "> </ span > < span class ="n "> basic_string</ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> Allocator</ span > < span class ="o "> ></ span >
335335< span class ="w "> </ span > < span class ="k "> operator</ span > < span class ="o "> +</ span > < span class ="p "> (</ span > < span class ="n "> basic_string</ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> Allocator</ span > < span class ="o "> >&&</ span > < span class ="w "> </ span > < span class ="n "> lhs</ span > < span class ="p "> ,</ span >
336336< span class ="w "> </ span > < span class ="n "> charT</ span > < span class ="w "> </ span > < span class ="n "> rhs</ span > < span class ="p "> );</ span > < span class ="w "> </ span > < span class ="c1 "> // (12) C++20</ span >
337+
338+ < span class ="w "> </ span > < span class ="k "> template</ span > < span class ="w "> </ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> Allocator</ span > < span class ="o "> ></ span >
339+ < span class ="w "> </ span > < span class ="k "> constexpr</ span > < span class ="w "> </ span > < span class ="n "> basic_string</ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> Allocator</ span > < span class ="o "> ></ span >
340+ < span class ="w "> </ span > < span class ="k "> operator</ span > < span class ="o "> +</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="w "> </ span > < span class ="n "> basic_string</ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> Allocator</ span > < span class ="o "> >&</ span > < span class ="w "> </ span > < span class ="n "> lhs</ span > < span class ="p "> ,</ span >
341+ < span class ="w "> </ span > < span class ="n "> type_identity_t</ span > < span class ="o "> <</ span > < span class ="n "> < a href ="../../string_view/basic_string_view.html "> basic_string_view</ a > </ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="o "> >></ span > < span class ="w "> </ span > < span class ="n "> rhs</ span > < span class ="p "> );</ span > < span class ="w "> </ span > < span class ="c1 "> // (13) C++26</ span >
342+
343+ < span class ="w "> </ span > < span class ="k "> template</ span > < span class ="w "> </ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> Allocator</ span > < span class ="o "> ></ span >
344+ < span class ="w "> </ span > < span class ="k "> constexpr</ span > < span class ="w "> </ span > < span class ="n "> basic_string</ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> Allocator</ span > < span class ="o "> ></ span >
345+ < span class ="w "> </ span > < span class ="k "> operator</ span > < span class ="o "> +</ span > < span class ="p "> (</ span > < span class ="n "> basic_string</ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> Allocator</ span > < span class ="o "> >&&</ span > < span class ="w "> </ span > < span class ="n "> lhs</ span > < span class ="p "> ,</ span >
346+ < span class ="w "> </ span > < span class ="n "> type_identity_t</ span > < span class ="o "> <</ span > < span class ="n "> < a href ="../../string_view/basic_string_view.html "> basic_string_view</ a > </ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="o "> >></ span > < span class ="w "> </ span > < span class ="n "> rhs</ span > < span class ="p "> );</ span > < span class ="w "> </ span > < span class ="c1 "> // (14) C++26</ span >
337347< span class ="p "> }</ span >
338348</ code > </ pre > </ div >
339349</ p >
350+ < ul >
351+ < li > type_identity_t[link /reference/type_traits/type_identity.md]</ li >
352+ < li > basic_string_view[link /reference/string_view/basic_string_view.md]</ li >
353+ </ ul >
340354< h2 > 概要</ h2 >
341355< p > < code > basic_string</ code > オブジェクトの連結を行う。</ p >
356+ < ul >
357+ < li > (1) : < code > basic_string</ code > オブジェクト同士を連結する</ li >
358+ < li > (2) : 右辺値の< code > basic_string</ code > オブジェクトと< code > basic_string</ code > オブジェクトを連結する</ li >
359+ < li > (3) : < code > basic_string</ code > オブジェクトと右辺値の< code > basic_string</ code > オブジェクトを連結する</ li >
360+ < li > (4) : 右辺値の< code > basic_string</ code > オブジェクト同士を連結する</ li >
361+ < li > (5) : 文字配列と< code > basic_string</ code > オブジェクトを連結する</ li >
362+ < li > (6) : 文字配列と右辺値の< code > basic_string</ code > オブジェクトを連結する</ li >
363+ < li > (7) : 文字と< code > basic_string</ code > オブジェクトを連結する</ li >
364+ < li > (8) : 文字と右辺値の< code > basic_string</ code > オブジェクトを連結する</ li >
365+ < li > (9) : < code > basic_string</ code > オブジェクトと文字配列を連結する</ li >
366+ < li > (10) : 右辺値の< code > basic_string</ code > オブジェクトと文字配列を連結する</ li >
367+ < li > (11) : < code > basic_string</ code > オブジェクトと文字を連結する</ li >
368+ < li > (12) : 右辺値の< code > basic_string</ code > オブジェクトと文字を連結する</ li >
369+ < li > (13) : < code > basic_string</ code > オブジェクトと< code > < a href ="../../string_view/basic_string_view.html "> basic_string_view</ a > </ code > オブジェクトを連結する</ li >
370+ < li > (14) : 右辺値の< code > basic_string</ code > オブジェクトと< code > < a href ="../../string_view/basic_string_view.html "> basic_string_view</ a > </ code > オブジェクトを連結する</ li >
371+ </ ul >
342372< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数呼び出し式の評価結果となるオブジェクト・値 "> 戻り値</ a > </ h2 >
343373< h3 > C++17まで</ h3 >
344374< ul >
@@ -458,6 +488,23 @@ <h3>C++20から</h3>
458488</ code > </ pre > </ div >
459489</ p >
460490</ li >
491+ < li >
492+ < p > (13) : 以下と等価
493+ < br />
494+ < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="n "> basic_string</ span > < span class ="o "> <</ span > < span class ="n "> charT</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> traits</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> Allocator</ span > < span class ="o "> ></ span > < span class ="w "> </ span > < span class ="n "> r</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> lhs</ span > < span class ="p "> ;</ span >
495+ < span class ="n "> r</ span > < span class ="p "> .</ span > < span class ="n "> < a href ="append.html "> append</ a > </ span > < span class ="p "> (</ span > < span class ="n "> rhs</ span > < span class ="p "> );</ span >
496+ < span class ="k "> return</ span > < span class ="w "> </ span > < span class ="n "> r</ span > < span class ="p "> ;</ span >
497+ </ code > </ pre > </ div >
498+ </ p >
499+ </ li >
500+ < li >
501+ < p > (14) : 以下と等価
502+ < br />
503+ < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="n "> lhs</ span > < span class ="p "> .</ span > < span class ="n "> < a href ="append.html "> append</ a > </ span > < span class ="p "> (</ span > < span class ="n "> rhs</ span > < span class ="p "> );</ span >
504+ < span class ="k "> return</ span > < span class ="w "> </ span > < span class ="n "> std</ span > < span class ="o "> ::</ span > < span class ="n "> move</ span > < span class ="p "> (</ span > < span class ="n "> lhs</ span > < span class ="p "> );</ span >
505+ </ code > </ pre > </ div >
506+ </ p >
507+ </ li >
461508</ ul >
462509< h2 > 備考</ h2 >
463510< p > (5), (6) の形式の < code > lhs</ code > 、および、(9), (10) の形式の < code > rhs</ code > の文字列長算出のために < code > traits::length()</ code > が使用される</ p >
@@ -571,10 +618,27 @@ <h2>アロケータの伝播</h2>
571618< td > < code > lhs</ code > </ td >
572619< td > < code > lhs</ code > </ td >
573620</ tr >
621+ < tr >
622+ < td > (13) : < code > lhs + sv</ code > </ td >
623+ < td > </ td >
624+ < td > </ td >
625+ < td > </ td >
626+ < td > </ td >
627+ < td > < code > lhs</ code > からのSOCCC</ td >
628+ </ tr >
629+ < tr >
630+ < td > (14) : < code > std::move(lhs) + sv</ code > </ td >
631+ < td > </ td >
632+ < td > </ td >
633+ < td > </ td >
634+ < td > </ td >
635+ < td > < code > lhs</ code > </ td >
636+ </ tr >
574637</ tbody >
575638</ table >
576639< p > 表にあるように、C++17までの仕様に完全に準拠している実装は無かった上に各実装によって伝播仕様がバラバラだったため、この変更によって影響を受けるコードはほぼ無いと思われる。</ p >
577640< h2 > 例</ h2 >
641+ < h3 > 基本的な使い方</ h3 >
578642< p > < div class ="yata " id ="5a5b944643b7eb709ec1dc76bdaf86231a131e33 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../../iostream.html "> <iostream></ a > </ span >
579643< span class ="cp "> #include < a href ="../../string.html "> <string></ a > </ span >
580644
@@ -589,9 +653,33 @@ <h2>例</h2>
589653< span class ="p "> }</ span >
590654</ code > </ pre > </ div >
591655</ div > </ p >
592- < h3 > 出力</ h3 >
656+ < h4 > 出力</ h4 >
593657< p > < pre > < code > Hello, world!
594658</ code > </ pre > </ p >
659+ < h3 > string_viewとの連結 (C++26)</ h3 >
660+ < p > < div class ="yata " id ="140d8b7a3041e4dc85e9f9f24b88f3060d371279 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../../iostream.html "> <iostream></ a > </ span >
661+ < span class ="cp "> #include < a href ="../../string.html "> <string></ a > </ span >
662+ < span class ="cp "> #include < a href ="../../string_view.html "> <string_view></ a > </ span >
663+
664+ < span class ="kt "> int</ span > < span class ="w "> </ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span >
665+ < span class ="p "> {</ span >
666+ < span class ="w "> </ span > < span class ="n "> < a href ="../basic_string.html "> std::string</ a > </ span > < span class ="w "> </ span > < span class ="n "> s</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="s "> "Hello"</ span > < span class ="p "> ;</ span >
667+ < span class ="w "> </ span > < span class ="n "> < a href ="../../string_view/basic_string_view.html "> std::string_view</ a > </ span > < span class ="w "> </ span > < span class ="n "> sv</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="s "> ", World!"</ span > < span class ="p "> ;</ span >
668+
669+ < span class ="w "> </ span > < span class ="c1 "> // string < span style ="color:#ff0000 "> +</ span > < a href ="../../string_view/basic_string_view.html "> string_view</ a > (13)</ span >
670+ < span class ="w "> </ span > < span class ="n "> < a href ="../basic_string.html "> std::string</ a > </ span > < span class ="w "> </ span > < span class ="n "> result1</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> s</ span > < span class ="w "> </ span > < span class ="n "> < span style ="color:#ff0000 "> +</ span > </ span > < span class ="w "> </ span > < span class ="n "> sv</ span > < span class ="p "> ;</ span >
671+ < span class ="w "> </ span > < span class ="n "> < a href ="../../iostream/cout.html "> std::cout</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> result1</ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="sc "> '\n'</ span > < span class ="p "> ;</ span >
672+
673+ < span class ="w "> </ span > < span class ="c1 "> // string&& < span style ="color:#ff0000 "> +</ span > < a href ="../../string_view/basic_string_view.html "> string_view</ a > (14)</ span >
674+ < span class ="w "> </ span > < span class ="n "> < a href ="../basic_string.html "> std::string</ a > </ span > < span class ="w "> </ span > < span class ="n "> result2</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../basic_string.html "> std::string</ a > </ span > < span class ="p "> (</ span > < span class ="s "> "Hello"</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="n "> < span style ="color:#ff0000 "> +</ span > </ span > < span class ="w "> </ span > < span class ="n "> sv</ span > < span class ="p "> ;</ span >
675+ < span class ="w "> </ span > < span class ="n "> < a href ="../../iostream/cout.html "> std::cout</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> result2</ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="sc "> '\n'</ span > < span class ="p "> ;</ span >
676+ < span class ="p "> }</ span >
677+ </ code > </ pre > </ div >
678+ </ div > </ p >
679+ < h4 > 出力</ h4 >
680+ < p > < pre > < code > Hello, World!
681+ Hello, World!
682+ </ code > </ pre > </ p >
595683< h2 > 関連項目</ h2 >
596684< table border ="1 " bordercolor ="#888 " style ="border-collapse:collapse ">
597685< thead >
@@ -615,10 +703,27 @@ <h2>関連項目</h2>
615703</ tr >
616704</ tbody >
617705</ table >
706+ < h2 > バージョン</ h2 >
707+ < h3 > 言語</ h3 >
708+ < ul >
709+ < li > C++03</ li >
710+ < li > C++26 : (13), (14)</ li >
711+ </ ul >
712+ < h3 > 処理系</ h3 >
713+ < ul >
714+ < li > < a href ="../../../implementation.html#clang "> Clang</ a > : ??</ li >
715+ < li > < a href ="../../../implementation.html#gcc "> GCC</ a > : ??</ li >
716+ < li > < a href ="../../../implementation.html#icc "> ICC</ a > : ??</ li >
717+ < li > < a href ="../../../implementation.html#visual_cpp "> Visual C++</ a > : ??</ li >
718+ </ ul >
618719< h2 > 参照</ h2 >
619720< ul >
620721< li > < a href ="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1165r1.html " target ="_blank "> P1165R1 Make stateful allocator propagation more consistent for operator+(basic_string)</ a > </ li >
621722< li > < a href ="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0980r1.pdf " target ="_blank "> P0980R1 Making < code > std::string</ code > constexpr</ a > </ li >
723+ < li > < a href ="https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2591r5.html " target ="_blank "> P2591R5 Concatenation of strings and string views</ a > < ul >
724+ < li > C++26で< code > string_view</ code > との連結が追加された</ li >
725+ </ ul >
726+ </ li >
622727</ ul > </ div >
623728
624729 </ div >
0 commit comments