std::basic_string<CharT,Traits,Allocator>::basic_string
| (1) | ||
| basic_string(); explicit basic_string( const Allocator& alloc ); |
(until C++17) | |
| basic_string() noexcept(noexcept( Allocator() )) : basic_string( Allocator() ) {} |
(since C++17) (until C++20) |
|
| constexpr basic_string() noexcept(noexcept( Allocator() )) : basic_string( Allocator() ) {} |
(since C++20) | |
| (2) | ||
| basic_string( size_type count, CharT ch, |
(until C++20) | |
| constexpr basic_string( size_type count, CharT ch, |
(since C++20) | |
| (3) | ||
| basic_string( const basic_string& other, size_type pos, |
(until C++17) | |
| basic_string( const basic_string& other, size_type pos, |
(since C++17) (until C++20) |
|
| constexpr basic_string( const basic_string& other, size_type pos, |
(since C++20) | |
| (3) | ||
| basic_string( const basic_string& other, size_type pos, |
(since C++17) (until C++20) |
|
| constexpr basic_string( const basic_string& other, size_type pos, |
(since C++20) | |
| (4) | ||
| basic_string( const CharT* s, size_type count, |
(until C++20) | |
| constexpr basic_string( const CharT* s, size_type count, |
(since C++20) | |
| (5) | ||
| basic_string( const CharT* s, const Allocator& alloc = Allocator() ); |
(until C++20) | |
| constexpr basic_string( const CharT* s, const Allocator& alloc = Allocator() ); |
(since C++20) | |
| (6) | ||
| template< class InputIt > basic_string( InputIt first, InputIt last, |
(until C++20) | |
| template< class InputIt > constexpr basic_string( InputIt first, InputIt last, |
(since C++20) | |
| (7) | ||
| basic_string( const basic_string& other ); |
(until C++20) | |
| constexpr basic_string( const basic_string& other ); |
(since C++20) | |
| (7) | ||
| basic_string( const basic_string& other, const Allocator& alloc ); |
(since C++11) (until C++20) |
|
| constexpr basic_string( const basic_string& other, const Allocator& alloc ); |
(since C++20) | |
| (8) | ||
| basic_string( basic_string&& other ) noexcept; |
(since C++11) (until C++20) |
|
| constexpr basic_string( basic_string&& other ) noexcept; |
(since C++20) | |
| (8) | ||
| basic_string( basic_string&& other, const Allocator& alloc ); |
(since C++11) (until C++20) |
|
| constexpr basic_string( basic_string&& other, const Allocator& alloc ); |
(since C++20) | |
| (9) | ||
| basic_string( std::initializer_list<CharT> ilist, const Allocator& alloc = Allocator() ); |
(since C++11) (until C++20) |
|
| constexpr basic_string( std::initializer_list<CharT> ilist, const Allocator& alloc = Allocator() ); |
(since C++20) | |
| (10) | ||
| template < class T > explicit basic_string( const T& t, const Allocator& alloc = Allocator() ); |
(since C++17) (until C++20) |
|
| template < class T > explicit constexpr basic_string( const T& t, |
(since C++20) | |
| (11) | ||
| template < class T > basic_string( const T& t, size_type pos, size_type n, |
(since C++17) (until C++20) |
|
| template < class T > constexpr basic_string( const T& t, size_type pos, size_type n, |
(since C++20) | |
| constexpr basic_string( std::nullptr_t ) = delete; |
(12) | (since C++23) |
Constructs new string from a variety of data sources and optionally using user supplied allocator alloc.
count copies of character ch. This constructor is not used for class template argument deduction if the Allocator type that would be deduced does not qualify as an allocator. (since C++17)[pos, pos+count) of other. If count == npos, if count is not specified, or if the requested substring lasts past the end of the string, the resulting substring is [pos, other.size()).count characters of character string pointed to by s. s can contain null characters. The length of the string is count. The behavior is undefined if [s, s + count) is not a valid range.s. The length of the string is determined by the first null character. The behavior is undefined if [s, s + Traits::length(s)) is not a valid range (for example, if s is a null pointer). This constructor is not used for class template argument deduction if the Allocator type that would be deduced does not qualify as an allocator. (since C++17)[first, last).
|
If |
(until C++11) |
|
This constructor only participates in overload resolution if |
(since C++11) |
other.other using move semantics. other is left in valid, but unspecified state.ilist. t to a string view sv as if by std::basic_string_view<CharT, Traits> sv = t;, then initializes the string with the contents of sv, as if by basic_string(sv.data(), sv.size(), alloc). This overload participates in overload resolution only if std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> is true and std::is_convertible_v<const T&, const CharT*> is false. t to a string view sv as if by std::basic_string_view<CharT, Traits> sv = t;, then initializes the string with the subrange [pos, pos + n) of sv as if by basic_string(sv.substr(pos, n), alloc). This overload participates in overload resolution only if std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> is true .basic_string cannot be constructed from nullptr.Contents |
Parameters
| alloc | - | allocator to use for all memory allocations of this string |
| count | - | size of the resulting string |
| ch | - | value to initialize the string with |
| pos | - | position of the first character to include |
| first, last | - | range to copy the characters from |
| s | - | pointer to an array of characters to use as source to initialize the string with |
| other | - | another string to use as source to initialize the string with |
| ilist | - | std::initializer_list to initialize the string with |
| t | - | object (convertible to std::basic_string_view) to initialize the string with |
Complexity
countsfirst and lastotheralloc is given and alloc != other.get_allocator(), then linearilistExceptions
Throws std::length_error if the length of the constructed string would exceed max_size() (for example, if count > max_size() for (2)). Calls to Allocator::allocate may throw.
Notes
Initialization with a string literal that contains embedded '\0' characters uses the overload (5), which stops at the first null character. This can be avoided by specifying a different constructor or by using operator""s:
std::string s1 = "ab\0\0cd"; // s1 contains "ab" std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd" std::string s3 = "ab\0\0cd"s; // s3 contains "ab\0\0cd"
Example
#include <iostream> #include <iomanip> #include <cassert> #include <iterator> #include <string> #include <cctype> int main() { { std::cout << "1) string::string(); "; std::string s; assert(s.empty() && (s.length() == 0) && (s.size() == 0)); std::cout << "s.capacity(): " << s.capacity() << '\n'; // unspecified } { std::cout << "2) string::string(size_type count, charT ch): "; std::string s(4, '='); std::cout << std::quoted(s) << '\n'; // "====" } { std::cout << "3) string::string(const string& other, " "size_type pos, size_type count): "; std::string const other("Exemplary"); std::string s(other, 0, other.length()-1); std::cout << quoted(s) << '\n'; // "Exemplar" } { std::cout << "4) string::string(const string& other, size_type pos): "; std::string const other("Mutatis Mutandis"); std::string s(other, 8); std::cout << quoted(s) << '\n'; // "Mutandis", i.e. [8, 16) } { std::cout << "5) string::string(charT const* s, size_type count): "; std::string s("C-style string", 7); std::cout << quoted(s) << '\n'; // "C-style", i.e. [0, 7) } { std::cout << "6) string::string(charT const* s): "; std::string s("C-style\0string"); std::cout << quoted(s) << '\n'; // "C-style" } { std::cout << "7) string::string(InputIt first, InputIt last): "; char mutable_c_str[] = "another C-style string"; std::string s(std::begin(mutable_c_str)+8, std::end(mutable_c_str)-1); std::cout << quoted(s) << '\n'; // "C-style string" } { std::cout << "8) string::string(string&): "; std::string const other("Exemplar"); std::string s(other); std::cout << quoted(s) << '\n'; // "Exemplar" } { std::cout << "9) string::string(string&&): "; std::string s(std::string("C++ by ") + std::string("example")); std::cout << quoted(s) << '\n'; // "C++ by example" } { std::cout << "α) string::string(std::initializer_list<charT>): "; std::string s({ 'C', '-', 's', 't', 'y', 'l', 'e' }); std::cout << quoted(s) << '\n'; // "C-style" } { // before C++11, overload resolution selects string(InputIt first, InputIt last) // [with InputIt = int] which behaves *as if* string(size_type count, charT ch) // after C++11 the InputIt constructor is disabled for integral types and calls: std::cout << "β) string::string(size_type count, charT ch) is called: "; std::string s(3, std::toupper('a')); std::cout << quoted(s) << '\n'; // "AAA" } }
Possible output:
1) string::string(); s.capacity(): 15 2) string::string(size_type count, charT ch): "====" 3) string::string(const string& other, size_type pos, size_type count): "Exemplar" 4) string::string(const string& other, size_type pos): "Mutandis" 5) string::string(charT const* s, size_type count): "C-style" 6) string::string(charT const* s): "C-style" 7) string::string(InputIt first, InputIt last): "C-style string" 8) string::string(string&): "Exemplar" 9) string::string(string&&): "C++ by example" α) string::string(std::initializer_list<charT>): "C-style" β) string::string(size_type count, charT ch) is called: "AAA"
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2193 | C++11 | the default constructor is explicit | made non-explicit |
| LWG 2946 | C++17 | string_view overload causes ambiguity in some cases
|
avoided by making it a template |
| LWG 3076 | C++17 | two constructors may cause ambiguities in class template argument deduction | constrained |
See also
| assign characters to a string (public member function) | |
| assigns values to the string (public member function) | |
| (C++11) |
converts an integral or floating point value to string (function) |
| (C++11) |
converts an integral or floating point value to wstring (function) |
constructs a basic_string_view (public member function of std::basic_string_view<CharT,Traits>)
|