std::basic_string<CharT,Traits,Allocator>::basic_string
: cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
| (1) | ||
basic_string(); explicit basic_string( const Allocator& alloc ); |
(C++17) | |
basic_string() noexcept(noexcept( Allocator() )) : basic_string( Allocator() ) {} explicit basic_string( const Allocator& alloc ) noexcept; |
(C++17) (C++20) |
|
constexpr basic_string() noexcept(noexcept( Allocator() )) : basic_string( Allocator() ) {} explicit constexpr basic_string( const Allocator& alloc ) noexcept; |
(C++20) | |
| (2) | ||
basic_string( size_type count, CharT ch, const Allocator& alloc = Allocator() ); |
(C++20) | |
constexpr basic_string( size_type count, CharT ch, const Allocator& alloc = Allocator() ); |
(C++20) | |
| (3) | ||
basic_string( const basic_string& other, size_type pos, size_type count = std::basic_string::npos, const Allocator& alloc = Allocator() ); |
(C++17) | |
basic_string( const basic_string& other, size_type pos, const Allocator& alloc = Allocator() ); |
(C++17) (C++20) |
|
constexpr basic_string( const basic_string& other, size_type pos, const Allocator& alloc = Allocator() ); |
(C++20) | |
| (3) | ||
basic_string( const basic_string& other, size_type pos, size_type count, const Allocator& alloc = Allocator() ); |
(C++17) (C++20) |
|
constexpr basic_string( const basic_string& other, size_type pos, size_type count, const Allocator& alloc = Allocator() ); |
(C++20) | |
| (4) | ||
basic_string( const CharT* s, size_type count, const Allocator& alloc = Allocator() ); |
(C++20) | |
constexpr basic_string( const CharT* s, size_type count, const Allocator& alloc = Allocator() ); |
(C++20) | |
| (5) | ||
basic_string( const CharT* s, const Allocator& alloc = Allocator() ); |
(C++20) | |
constexpr basic_string( const CharT* s, const Allocator& alloc = Allocator() ); |
(C++20) | |
| (6) | ||
template< class InputIt > basic_string( InputIt first, InputIt last, const Allocator& alloc = Allocator() ); |
(C++20) | |
template< class InputIt > constexpr basic_string( InputIt first, InputIt last, const Allocator& alloc = Allocator() ); |
(C++20) | |
| (7) | ||
basic_string( const basic_string& other ); |
(C++20) | |
constexpr basic_string( const basic_string& other ); |
(C++20) | |
| (7) | ||
basic_string( const basic_string& other, const Allocator& alloc ); |
(C++11) (C++20) |
|
constexpr basic_string( const basic_string& other, const Allocator& alloc ); |
(C++20) | |
| (8) | ||
basic_string( basic_string&& other ) noexcept; |
(C++11) (C++20) |
|
constexpr basic_string( basic_string&& other ) noexcept; |
(C++20) | |
| (8) | ||
basic_string( basic_string&& other, const Allocator& alloc ); |
(C++11) (C++20) |
|
constexpr basic_string( basic_string&& other, const Allocator& alloc ); |
(C++20) | |
| (9) | ||
basic_string( std::initializer_list<CharT> ilist, const Allocator& alloc = Allocator() ); |
(C++11) (C++20) |
|
constexpr basic_string( std::initializer_list<CharT> ilist, const Allocator& alloc = Allocator() ); |
(C++20) | |
| (10) | ||
template < class T > explicit basic_string( const T& t, const Allocator& alloc = Allocator() ); |
(C++17) (C++20) |
|
template < class T > explicit constexpr basic_string( const T& t, const Allocator& alloc = Allocator() ); |
(C++20) | |
| (11) | ||
template < class T > basic_string( const T& t, size_type pos, size_type n, const Allocator& alloc = Allocator() ); |
(C++17) (C++20) |
|
template < class T > constexpr basic_string( const T& t, size_type pos, size_type n, const Allocator& alloc = Allocator() ); |
(C++20) | |
alloc
1) ()
3)
other [pos, pos+count) count == npos count [pos, other.size()) 4)
s count s count [s, s + count) 6)
[first, last)
|
|
(C++11) |
|
|
(C++11) |
7)
other 8)
other other 9)
ilist 10)
std::basic_string_view<CharT, Traits> sv = t; t sv basic_string(sv.data(), sv.size(), alloc) sv std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> true std::is_convertible_v<const T&, const CharT*> false 11)
std::basic_string_view<CharT, Traits> sv = t; t sv basic_string(sv.substr(pos, n), a) sv [pos, pos + n) std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> true | alloc | - | |
| count | - | |
| ch | - | |
| pos | - | |
| first, last | - | |
| s | - | |
| other | - | |
| ilist | - | std::initializer_list |
| t | - | (std::basic_string_view ) |
1)
2-4)
count 5)
s 6)
first last 7)
other 8)
alloc alloc != other.get_allocator() 9)
ilist 8)
alloc == str.get_allocator() max_size() ( (2) count > max_size() ) std::length_error Allocator::allocate
'\0' (5) 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"
C++
| DR | |||
|---|---|---|---|
| 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 |
Run this code
#include <iostream>
#include <cassert>
#include <iterator>
#include <string>
#include <cctype>
int main()
{
{
// string::string()
std::string s;
assert(s.empty() && (s.length() == 0) && (s.size() == 0));
}
{
// string::string(size_type count, charT ch)
std::string s(4, '=');
std::cout << s << '\n'; // "===="
}
{
std::string const other("Exemplary");
// string::string(string const& other, size_type pos, size_type count)
std::string s(other, 0, other.length()-1);
std::cout << s << '\n'; // "Exemplar"
}
{
// string::string(charT const* s, size_type count)
std::string s("C-style string", 7);
std::cout << s << '\n'; // "C-style"
}
{
// string::string(charT const* s)
std::string s("C-style\0string");
std::cout << s << '\n'; // "C-style"
}
{
char mutable_c_str[] = "another C-style string";
// string::string(InputIt first, InputIt last)
std::string s(std::begin(mutable_c_str)+8, std::end(mutable_c_str)-1);
std::cout << s << '\n'; // "C-style string"
}
{
std::string const other("Exemplar");
std::string s(other);
std::cout << s << '\n'; // "Exemplar"
}
{
// string::string(string&& str)
std::string s(std::string("C++ by ") + std::string("example"));
std::cout << s << '\n'; // "C++ by example"
}
{
// string(std::initializer_list<charT> ilist)
std::string s({ 'C', '-', 's', 't', 'y', 'l', 'e' });
std::cout << s << '\n'; // "C-style"
}
{
// overload resolution selects string(InputIt first, InputIt last) [with InputIt = int]
// which behaves as if string(size_type count, charT ch) is called
std::string s(3, std::toupper('a'));
std::cout << s << '\n'; // "AAA"
}
}
:
====
Exemplar
C-style
C-style
C-style string
Exemplar
C++ by example
C-style
AAA
| () | |
| () | |
(C++11) |
string () |
(C++11) |
wstring () |