std::basic_...basic_string(3)
π NAME π
std::basic_string::basic_string β yep, the constructor itself, aka std::basic_string::basic_string. This page is from the C++ Standard Libary manual as std::basic_...basic_string(3) (we are keeping the manual name exactly as it appears, bestie π
).
β¨ Synopsis β¨
okay so hereβs the whole constructor buffet. Deep breath, babe β every overload is here, no skips, no cap π«Ά:
basic_string();
// (1) (until C++17)
basic_string() noexcept(noexcept(Allocator()))
: basic_string( Allocator() ) {}
// (1) (since C++17) (constexpr since C++20) (noexcept since C++17)
explicit basic_string( const Allocator& alloc );
// (2) (constexpr since C++20)
basic_string( size_type count, CharT ch,
const Allocator& alloc = Allocator() );
// (3) (constexpr since C++20)
basic_string( const basic_string& other, size_type pos,
const Allocator& alloc = Allocator() );
// (4) (constexpr since C++20)
constexpr basic_string( basic_string&& other, size_type pos,
const Allocator& alloc = Allocator() );
// (5) (since C++23)
basic_string( const basic_string& other,
size_type pos, size_type count,
const Allocator& alloc = Allocator() );
// (6) (since C++23)
constexpr basic_string( basic_string&& other,
size_type pos, size_type count,
const Allocator& alloc = Allocator() );
// (7) (since C++23)
basic_string( const CharT* s, size_type count,
const Allocator& alloc = Allocator() );
// (8) (constexpr since C++20)
basic_string( const CharT* s, const Allocator& alloc = Allocator() );
// (9) (constexpr since C++20)
template< class InputIt >
basic_string( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
// (10) (constexpr since C++20)
basic_string( const basic_string& other );
// (11) (constexpr since C++20)
basic_string( const basic_string& other, const Allocator& alloc );
// (12) (since C++11) (constexpr since C++20)
basic_string( basic_string&& other ) noexcept;
// (13) (since C++11) (constexpr since C++20)
basic_string( basic_string&& other, const Allocator& alloc );
// (14) (since C++11) (constexpr since C++20)
basic_string( std::initializer_list<CharT> ilist,
const Allocator& alloc = Allocator() );
// (15) (since C++11) (constexpr since C++20)
template< class StringViewLike >
explicit basic_string( const StringViewLike& t,
const Allocator& alloc = Allocator() );
// (16) (since C++17) (constexpr since C++20)
template< class StringViewLike >
basic_string( const StringViewLike& t, size_type pos,
size_type n,
const Allocator& alloc = Allocator() );
// (17) (since C++17) (constexpr since C++20)
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,
const Allocator& = Allocator());
// (19) (since C++23)
Constructs new string from a variety of data sources and optionally using user supplied allocator alloc.
- (1), (2) β Default constructor energy. Constructs an 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
countcopies of characterch. Also, this constructor is not used for class template argument deduction if theAllocatortype that would be deduced does not qualify as an allocator. (since C++17) - (4)β(7) β Constructs the string with a substring
[pos, pos + count)ofother. Ifcount == npos, ifcountis not specified, or if the requested substring lasts past the end of the string, the resulting substring is[pos, other.size()). Ifotheris an rvalue reference, it is left in a valid but unspecified state. (since C++23) - (8) β Constructs the string with the first
countcharacters of character string pointed to bys.scan contain null characters. The length of the string iscount. The behavior is undefined if[s, s + count)is not a valid range. Thatβs undefined behavior, bestie β do not play with it. - (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, ifsis a null pointer). This constructor is not used for class template argument deduction if theAllocatortype 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). IfInputItis an integral type, equivalent to overload (2), as if bybasic_string(static_cast<size_type>(first), static_cast<value_type>(last), alloc). (until C++11) This constructor only participates in overload resolution ifInputItsatisfiesLegacyInputIterator. (since C++11) - (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
otherusing move semantics.otheris left in valid, but unspecified state. - (15) β Constructs the string with the contents of the initializer list
ilist. - (16) β Implicitly converts
tto a string viewsvas if bystd::basic_string_view<CharT, Traits> sv = t;, then initializes the string with the contents ofsv, as if bybasic_string(sv.data(), sv.size(), alloc). This overload participates in overload resolution only ifstd::is_convertible_v<const StringViewLike&, std::basic_string_view<CharT, Traits>>is true andstd::is_convertible_v<const StringViewLike&, const CharT*>is false. - (17) β Implicitly converts
tto a string viewsvas if bystd::basic_string_view<CharT, Traits> sv = t;, then initializes the string with the subrange[pos, pos + n)ofsvas if bybasic_string(sv.substr(pos, n), alloc). This overload participates in overload resolution only ifstd::is_convertible_v<const StringViewLike&, std::basic_string_view<CharT, Traits>>is true. - (18) β
std::basic_stringcannot be constructed fromnullptr. - (19) β Constructs the string with the values contained in the range
rg.
πΈ Parameters πΈ
line up, bestie β hereβs what all the little names mean π:
allocβ allocator to use for all memory allocations of this stringcountβ size of the resulting stringchβ value to initialize the string withposβ position of the first character to includefirst,lastβ range to copy the characters fromsβ pointer to an array of characters to use as source to initialize the string withotherβ another string to use as source to initialize the string withilistβstd::initializer_listto initialize the string withtβ object (convertible tostd::basic_string_view) to initialize the string withrgβ a container compatible range
π₯ Complexity π₯
- (1), (2) β Constant.
- (3)β(8) β Linear in
count. - (9) β Linear in length of
s. - (10) β Linear in distance between
firstandlast. - (11), (12) β Linear in size of
other. - (13) β Constant.
- (14) β Constant. If
allocis given andalloc != 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_rangeifpos > other.size(). - (13) β Throws nothing.
- (14) β Throws nothing if
alloc == str.get_allocator(). - (17) β
std::out_of_rangeifposis out of range.
Throwsstd::length_errorif the length of the constructed string would exceedmax_size()(for example, ifcount > max_size()for (3)). Calls toAllocator::allocatemay 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
__cpp_lib_containers_rangesβ202202Lβ(C++23)β Tagged constructor (19) to construct from container compatible range
β¨ EXAMPLE β¨
okay bestie, this is the part where we actually run the thing and watch every single constructor do its lil moment on stage π
the whole main() is literally a vibe check for each overload, numbered 1) through c) like a tracklist. no cap, run it yourself.
// 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++"
}
quick notes before you run off and compile, bestie π«Ά
- line
1)printss1.capacity()and it is unspecified β so your number is not gonna match mine and that is fine, it's literally in the comments. - the commented-out
std::string sc(nullptr);line: before C++23 it throwsstd::logic_error, and since C++23 it won't compile at all, see overload(18). π - the commented-out
std::string sc(0);line: same deal, because literal0is a null pointer constant. - the
#ifdef __cpp_lib_containers_rangesdance picks the tagged constructor(19)when ranges are available, otherwise it falls back to overload(12).
π¬ 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++"
πΈ reminder that thes1.capacity()value here (15) is just one possible output β it's unspecified, so don't come for me if yours says something else.
π DEFECT REPORTS
these are the glow-up receipts β¨ the following behavior-changing defect reports were applied retroactively to previously published C++ standards β meaning the standard got a patch note and the old behavior was, respectfully, not it.
LWG 301, applied to C++98 β behavior as published: overload(10)did not use the parameterallocifInputItis an integral type β correct behavior: use that parameter πLWG 847, applied to C++98 β behavior as published: there was no exception safety guarantee β correct behavior: added strong exception safety guarantee π«ΆLWG 2193, applied to C++11 β behavior as published: the default constructor isexplicitβ correct behavior: made non-explicitLWG 2583, applied to C++98 β behavior as published: there is no way to supply an allocator forbasic_string(str, pos)β correct behavior: there is a constructor forbasic_string(str, pos, alloc)πLWG 2946, applied to C++17 β behavior as published: overload(16)causes ambiguity in some cases β correct behavior: avoided by making it a templateLWG 3076, applied to C++17 β behavior as published: two constructors may cause ambiguities in class template argument deduction β correct behavior: constrained β
π SEE ALSO
the whole friend group of related members, go say hi:
assignβ assign characters to a string (public member function)operator=β assigns values to the string (public member function)to_string(C++11) β converts an integral or floating-point value to string (function)to_wstring(C++11) β converts an integral or floating-point value towstring(function)constructorβ constructs abasic_string_view(public member function ofstd::basic_string_view<CharT,Traits>)
and that's the whole page, bestie, we ate and left zero crumbs π this lil reference card lives at http://cppreference.com, it's the 2024.06.10 edition of the std::basic_...basic_string(3) page, and yes the title is literally abbreviated like that β iconic, no notes π go construct something gorgeous fr fr π¦
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms