table of contents
std::basic_string::basic_string(3) | C++ Standard Libary | std::basic_string::basic_string(3) |
NAME¶
std::basic_string::basic_string - std::basic_string::basic_string
Synopsis¶
basic_string(); (until C++17)
basic_string() noexcept(noexcept(Allocator())) (since C++17)
: basic_string( Allocator() ) {} (constexpr since
C++20)
(noexcept since
explicit basic_string( const Allocator& alloc ); (2) C++17)
(constexpr since
C++20)
basic_string( size_type count, CharT ch, (3) (constexpr since
const Allocator& alloc = Allocator() ); C++20)
basic_string( const basic_string& other, size_type pos, (4)
(constexpr since
const Allocator& alloc = Allocator() ); C++20)
constexpr basic_string( basic_string&& other, size_type
pos, (5) (since C++23)
const Allocator& alloc =
Allocator() );
basic_string( const basic_string& other,
size_type pos, size_type count, (6) (since C++23)
const Allocator& alloc = Allocator() );
constexpr basic_string( basic_string&& other,
size_type pos, size_type count, (7) (since C++23)
const Allocator& alloc =
Allocator() );
basic_string( const CharT* s, size_type count, (8) (constexpr since
const Allocator& alloc = Allocator() ); C++20)
basic_string( const CharT* s, const Allocator& alloc = (9)
(constexpr since
Allocator() ); C++20)
template< class InputIt >
(constexpr since
basic_string( InputIt first, InputIt last, (1) (10) C++20)
const Allocator& alloc = Allocator() );
basic_string( const basic_string& other ); (11) (constexpr since
C++20)
basic_string( const basic_string& other, const Allocator& (since
C++11)
alloc ); (12) (constexpr since
C++20)
(since C++11)
basic_string( basic_string&& other ) noexcept; (13) (constexpr
since
C++20)
basic_string( basic_string&& other, const Allocator& alloc
(since C++11)
); (14) (constexpr since
C++20)
basic_string( std::initializer_list<CharT> ilist, (since C++11)
const Allocator& alloc = Allocator() ); (15) (constexpr since
C++20)
template< class StringViewLike >
(since C++17)
explicit basic_string( const StringViewLike& t, (16) (constexpr
since
C++20)
const Allocator& alloc =
Allocator() );
template< class StringViewLike >
(since C++17)
basic_string( const StringViewLike& t, size_type pos, (17)
(constexpr since
size_type n, C++20)
const Allocator& alloc = Allocator() );
basic_string( std::nullptr_t ) = delete; (18) (since C++23)
template< container-compatible-range<CharT> R >
constexpr basic_string( std::from_range_t, R&& rg, (19) (since
C++23)
const Allocator& = Allocator());
Constructs new string from a variety of data sources and optionally using
user
supplied allocator alloc.
1,2) Default constructor. Constructs empty string (of zero size and
unspecified
capacity). If no allocator is supplied, allocator is obtained from a
default-constructed instance.
3) Constructs the string with 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)
4-7) Constructs the string with a substring [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()).
If other is an rvalue reference, it is left in a valid but unspecified state.
(since C++23)
8) Constructs the string with the first 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.
9) Constructs the string with the contents initialized with a copy of the
null-terminated character string pointed to by 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)
10) Constructs the string with the contents of the range [first, last).
If InputIt is an integral type, equivalent to overload (2), as if by
basic_string(static_cast<size_type>(first), (until C++11)
static_cast<value_type>(last), alloc).
This constructor only participates in overload resolution if InputIt
(since C++11)
satisfies LegacyInputIterator.
11,12) Copy constructor. Constructs the string with a copy of the contents of
other.
13,14) Move constructor. Constructs the string with the contents of other
using move
semantics. other is left in valid, but unspecified state.
15) Constructs the string with the contents of the initializer list ilist.
16) Implicitly converts 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 StringViewLike&,
std::basic_string_view<CharT, Traits>> is true and
std::is_convertible_v<const StringViewLike&, const CharT*> is
false.
17) Implicitly converts 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 StringViewLike&,
std::basic_string_view<CharT, Traits>> is true.
18) std::basic_string cannot be constructed from nullptr.
19) Constructs the string with the values contained in the range rg.
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
rg - a container compatible range
Complexity¶
1,2) Constant.
3-8) Linear in count.
9) Linear in length of s.
10) Linear in distance between first and last.
11,12) Linear in size of other.
13) Constant.
14) Constant. If alloc is given and alloc != other.get_allocator(), then
linear.
15) Linear in size of ilist.
16) Linear in size of t.
17) Linear in size of assigned substring, i.e. std::min(std::size(t) - pos,
n).
19) Linear in size of rg.
Exceptions¶
4-7) std::out_of_range if pos > other.size().
13) Throws nothing.
14) Throws nothing if alloc == str.get_allocator().
17) std::out_of_range if pos is out of range.
Throws std::length_error if the length of the constructed string would exceed
max_size() (for example, if count > max_size() for (3)). Calls to
Allocator::allocate may throw.
If an exception is thrown for any reason, these functions have no effect
(strong
exception safety guarantee).
Notes¶
Initialization with a string literal that contains embedded '\0'
characters uses the
overload (9), 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"
Feature-test macro Value Std Feature
__cpp_lib_containers_ranges 202202L (C++23) Tagged constructor (19) to
construct
from container compatible range
Example¶
// Run this code
#include <cassert>
#include <cctype>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
std::cout << "1) string(); ";
std::string s1;
assert(s1.empty() && (s1.length() == 0) && (s1.size() == 0));
std::cout << "s1.capacity(): " << s1.capacity()
<< '\n'; // unspecified
std::cout << "2) string(size_type count, CharT ch): ";
std::string s2(4, '=');
std::cout << std::quoted(s2) << '\n'; // "===="
std::cout << "3) string(const string& other, size_type pos,
size_type count): ";
std::string const other3("Exemplary");
std::string s3(other3, 0, other3.length() - 1);
std::cout << std::quoted(s3) << '\n'; // "Exemplar"
std::cout << "4) string(const string& other, size_type pos):
";
std::string const other4("Mutatis Mutandis");
std::string s4(other4, 8);
std::cout << std::quoted(s4) << '\n'; // "Mutandis",
i.e. [8, 16)
std::cout << "5) string(CharT const* s, size_type count): ";
std::string s5("C-style string", 7);
std::cout << std::quoted(s5) << '\n'; // "C-style",
i.e. [0, 7)
std::cout << "6) string(CharT const* s): ";
std::string s6("C-style\0string");
std::cout << std::quoted(s6) << '\n'; // "C-style"
std::cout << "7) string(InputIt first, InputIt last): ";
char mutable_c_str[] = "another C-style string";
std::string s7(std::begin(mutable_c_str) + 8, std::end(mutable_c_str) - 1);
std::cout << std::quoted(s7) << '\n'; // "C-style
string"
std::cout << "8) string(string&): ";
std::string const other8("Exemplar");
std::string s8(other8);
std::cout << std::quoted(s8) << '\n'; // "Exemplar"
std::cout << "9) string(string&&): ";
std::string s9(std::string("C++ by ") +
std::string("example"));
std::cout << std::quoted(s9) << '\n'; // "C++ by
example"
std::cout << "a) string(std::initializer_list<CharT>):
";
std::string sa({'C', '-', 's', 't', 'y', 'l', 'e'});
std::cout << std::quoted(sa) << '\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 << "b) string(size_type count, CharT ch) is called:
";
std::string sb(3, std::toupper('a'));
std::cout << std::quoted(sb) << '\n'; // "AAA"
// std::string sc(nullptr); // Before C++23: throws std::logic_error
// Since C++23: won't compile, see overload (18)
// std::string sc(0); // Same as above, as literal 0 is a null pointer
constant
auto const range = {0x43, 43, 43};
#ifdef __cpp_lib_containers_ranges
std::string sc(std::from_range, range); // tagged constructor (19)
std::cout << "c) string(std::from_range, range) is called: ";
#else
std::string sc(range.begin(), range.end()); // fallback to overload (12)
std::cout << "c) string(range.begin(), range.end()) is called:
";
#endif
std::cout << std::quoted(sc) << '\n'; // "C++"
}
Possible output:¶
1) string(); s1.capacity(): 15
2) string(size_type count, CharT ch): "===="
3) string(const string& other, size_type pos, size_type count):
"Exemplar"
4) string(const string& other, size_type pos): "Mutandis"
5) string(CharT const* s, size_type count): "C-style"
6) string(CharT const* s): "C-style"
7) string(InputIt first, InputIt last): "C-style string"
8) string(string&): "Exemplar"
9) string(string&&): "C++ by example"
a) string(std::initializer_list<CharT>): "C-style"
b) string(size_type count, CharT ch) is called: "AAA"
c) string(std::from_range, range) is called: "C++"
Defect reports
The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.
DR Applied to Behavior as published Correct behavior
overload (10) did not use the
LWG 301 C++98 parameter use that parameter
alloc if InputIt is an integral
type
LWG 847 C++98 there was no exception safety added strong exception safety
guarantee guarantee
LWG 2193 C++11 the default constructor is made non-explicit
explicit
there is no way to supply an there is a constructor for
LWG 2583 C++98 allocator basic_string(str, pos, alloc)
for basic_string(str, pos)
LWG 2946 C++17 overload (16) causes ambiguity in avoided by making it
a
some cases template
two constructors may cause
LWG 3076 C++17 ambiguities constrained
in class template argument
deduction
See also¶
assign assign characters to a string
(public member function)
operator= assigns values to the string
(public member function)
to_string converts an integral or floating-point value to string
(C++11) (function)
to_wstring converts an integral or floating-point value to wstring
(C++11) (function)
constructs a basic_string_view
constructor (public member function of
std::basic_string_view<CharT,Traits>)
2024.06.10 | http://cppreference.com |