|
|
|
Defined in header <string> | ||
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (1) | (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (2) | (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (3) | (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> constexprstd::basic_string<CharT,Traits,Alloc> | (4) | (since C++26) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (5) | (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (6) | (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> constexprstd::basic_string<CharT,Traits,Alloc> | (7) | (since C++26) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (8) | (since C++11) (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (9) | (since C++11) (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (10) | (since C++11) (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (11) | (since C++11) (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> constexprstd::basic_string<CharT,Traits,Alloc> | (12) | (since C++26) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (13) | (since C++11) (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (14) | (since C++11) (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> std::basic_string<CharT,Traits,Alloc> | (15) | (since C++11) (constexpr since C++20) |
template<class CharT,class Traits,class Alloc> constexprstd::basic_string<CharT,Traits,Alloc> | (16) | (since C++26) |
Returns a string containing characters fromlhs followed by the characters fromrhs. Equivalent to:
The allocator used for the result is: 1-4)std::allocator_traits<Alloc>::select_on_container_copy_construction(lhs.get_allocator()) 5-7)std::allocator_traits<Alloc>::select_on_container_copy_construction(rhs.get_allocator()) 8-12)lhs.get_allocator() 13-16)rhs.get_allocator() In other words:
In each case, the left operand is preferred when both are For(8-16), all rvalue | (since C++11) |
Contents |
lhs | - | string, string view(since C++26), character, or pointer to the first character in a null-terminated array |
rhs | - | string, string view(since C++26), character, or pointer to the first character in a null-terminated array |
A string containing characters fromlhs followed by the characters fromrhs, using the allocator determined as above(since C++11).
Notes
Because the allocator used by the result of using my_string=std::basic_string<char,std::char_traits<char>, my_allocator<char>>;my_string cat();const my_string& dog(); my_string meow=/* ... */, woof=/* ... */;meow+ cat()+/* ... */;// uses select_on_container_copy_construction on meow's allocatorwoof+ dog()+/* ... */;// uses allocator of dog()'s return value instead meow+ woof+ meow;// uses select_on_container_copy_construction on meow's allocatormeow+(woof+ meow);// uses SOCCC on woof's allocator instead For a chain of // use my_favorite_allocator for the final resultmy_string(my_favorite_allocator)+ meow+ woof+ cat()+ dog(); For better and portable control over allocators, member functions like | (since C++11) |
The usage ofstd::type_identity_t as parameter in overloads(4),(7),(12), and(16) ensures that an object of typestd::basic_string<CharT, Traits, Allocator> can always be concatenated to an object of a type
| (since C++26) |
#include <iostream>#include <string>#include <string_view> int main(){std::string s1="Hello";std::string s2="world";constchar* end="!\n";std::cout<< s1+' '+ s2+ end; std::string_view water{" Water"};#if __cpp_lib_string_view >= 202403std::cout<< s1+ water+ s2<< end;// overload (4), then (1)#elsestd::cout<< s1+std::string(water)+ s2<< end;// OK, but less efficient#endif}
Output:
Hello world!Hello Waterworld!
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P1165R1 | C++11 | allocator propagation is haphazard and inconsistent | made more consistent |
appends characters to the end (public member function)[edit] | |
appends characters to the end (public member function)[edit] | |
inserts characters (public member function)[edit] |