Files
2025-10-25 03:02:53 +03:00

416 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[string.cons]
# 27 Strings library [[strings]](./#strings)
## 27.4 String classes [[string.classes]](string.classes#string.cons)
### 27.4.3 Class template basic_string [[basic.string]](basic.string#string.cons)
#### 27.4.3.3 Constructors and assignment operators [string.cons]
[🔗](#lib:basic_string,constructor)
`constexpr explicit basic_string(const Allocator& a) noexcept;
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2431)
*Postconditions*: size() is equal to 0[.](#1.sentence-1)
[🔗](#lib:basic_string,constructor_)
`constexpr basic_string(const basic_string& str);
constexpr basic_string(basic_string&& str) noexcept;
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2443)
*Effects*: Constructs an object whose
value is that of str prior to this call[.](#2.sentence-1)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2448)
*Remarks*: In the second form, str is left in a valid but unspecified state[.](#3.sentence-1)
[🔗](#lib:basic_string,constructor__)
`constexpr basic_string(const basic_string& str, size_type pos,
const Allocator& a = Allocator());
constexpr basic_string(const basic_string& str, size_type pos, size_type n,
const Allocator& a = Allocator());
constexpr basic_string(basic_string&& str, size_type pos,
const Allocator& a = Allocator());
constexpr basic_string(basic_string&& str, size_type pos, size_type n,
const Allocator& a = Allocator());
`
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2466)
Let
- [(4.1)](#4.1)
s be the value of str prior to this call and
- [(4.2)](#4.2)
rlen be pos + min(n, s.size() - pos) for the overloads with parameter n, ands.size() otherwise[.](#4.sentence-1)
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2477)
*Effects*: Constructs an object
whose initial value is the range [s.data() + pos, s.data() + rlen)[.](#5.sentence-1)
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2482)
*Throws*: out_of_range if pos > s.size()[.](#6.sentence-1)
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2486)
*Remarks*: For the overloads with a basic_string&& parameter,str is left in a valid but unspecified state[.](#7.sentence-1)
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2491)
*Recommended practice*: For the overloads with a basic_string&& parameter,
implementations should avoid allocation
if s.get_allocator() == a is true[.](#8.sentence-1)
[🔗](#lib:basic_string,constructor___)
`template<class T>
constexpr basic_string(const T& t, size_type pos, size_type n, const Allocator& a = Allocator());
`
[9](#9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2505)
*Constraints*: is_convertible_v<const T&, basic_string_view<charT, traits>> is true[.](#9.sentence-1)
[10](#10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2510)
*Effects*: Creates a variable, sv,
as if by basic_string_view<charT, traits> sv = t; and then behaves the same as:basic_string(sv.substr(pos, n), a);
[🔗](#lib:basic_string,constructor____)
`template<class T>
constexpr explicit basic_string(const T& t, const Allocator& a = Allocator());
`
[11](#11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2527)
*Constraints*:
- [(11.1)](#11.1)
is_convertible_v<const T&, basic_string_view<charT, traits>> istrue and
- [(11.2)](#11.2)
is_convertible_v<const T&, const charT*> isfalse[.](#11.sentence-1)
[12](#12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2538)
*Effects*: Creates a variable, sv, as if bybasic_string_view<charT, traits> sv = t; and
then behaves the same as basic_string(sv.data(), sv.size(), a)[.](#12.sentence-1)
[🔗](#lib:basic_string,constructor_____)
`constexpr basic_string(const charT* s, size_type n, const Allocator& a = Allocator());
`
[13](#13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2551)
*Preconditions*: [s, s + n) is a valid range[.](#13.sentence-1)
[14](#14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2555)
*Effects*: Constructs an object whose initial value is the range [s, s + n)[.](#14.sentence-1)
[15](#15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2559)
*Postconditions*: size() is equal to n, andtraits::compare(data(), s, n) is equal to 0[.](#15.sentence-1)
[🔗](#lib:basic_string,constructor______)
`constexpr basic_string(const charT* s, const Allocator& a = Allocator());
`
[16](#16)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2571)
*Constraints*: Allocator is a type
that qualifies as an allocator ([[container.reqmts]](container.reqmts "23.2.2.2Container requirements"))[.](#16.sentence-1)
[*Note [1](#note-1)*:
This affects class template argument deduction[.](#16.sentence-2)
— *end note*]
[17](#17)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2579)
*Effects*: Equivalent to: basic_string(s, traits::length(s), a)[.](#17.sentence-1)
[🔗](#lib:basic_string,constructor_______)
`constexpr basic_string(size_type n, charT c, const Allocator& a = Allocator());
`
[18](#18)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2590)
*Constraints*: Allocator is a type
that qualifies as an allocator ([[container.reqmts]](container.reqmts "23.2.2.2Container requirements"))[.](#18.sentence-1)
[*Note [2](#note-2)*:
This affects class template argument deduction[.](#18.sentence-2)
— *end note*]
[19](#19)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2598)
*Effects*: Constructs an object whose value consists of n copies of c[.](#19.sentence-1)
[🔗](#lib:basic_string,constructor________)
`template<class InputIterator>
constexpr basic_string(InputIterator begin, InputIterator end, const Allocator& a = Allocator());
`
[20](#20)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2610)
*Constraints*: InputIterator is a type that qualifies as an input
iterator ([[container.reqmts]](container.reqmts "23.2.2.2Container requirements"))[.](#20.sentence-1)
[21](#21)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2615)
*Effects*: Constructs a string from the values in the range [begin, end),
as specified in [[sequence.reqmts]](sequence.reqmts "23.2.4Sequence containers")[.](#21.sentence-1)
[🔗](#lib:basic_string,constructor_________)
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1Introduction[container.intro.reqmts]")<charT> R>
constexpr basic_string(from_range_t, R&& rg, const Allocator& = Allocator());
`
[22](#22)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2628)
*Effects*: Constructs a string from the values in the range rg,
as specified in [[sequence.reqmts]](sequence.reqmts "23.2.4Sequence containers")[.](#22.sentence-1)
[🔗](#lib:basic_string,constructor__________)
`constexpr basic_string(initializer_list<charT> il, const Allocator& a = Allocator());
`
[23](#23)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2640)
*Effects*: Equivalent to basic_string(il.begin(), il.end(), a)[.](#23.sentence-1)
[🔗](#lib:basic_string,constructor___________)
`constexpr basic_string(const basic_string& str, const Allocator& alloc);
constexpr basic_string(basic_string&& str, const Allocator& alloc);
`
[24](#24)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2652)
*Effects*: Constructs an object whose value is
that of str prior to this call[.](#24.sentence-1)
The stored allocator is constructed from alloc[.](#24.sentence-2)
In the second form, str is left in a valid but unspecified state[.](#24.sentence-3)
[25](#25)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2659)
*Throws*: The second form throws nothing if alloc == str.get_allocator()[.](#25.sentence-1)
[🔗](#itemdecl:13)
`template<class InputIterator,
class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
basic_string(InputIterator, InputIterator, Allocator = Allocator())
-> basic_string<typename iterator_traits<InputIterator>::value_type,
char_traits<typename iterator_traits<InputIterator>::value_type>,
Allocator>;
`
[26](#26)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2674)
*Constraints*: InputIterator is a type that qualifies as an input iterator,
and Allocator is a type that qualifies as an allocator ([[container.reqmts]](container.reqmts "23.2.2.2Container requirements"))[.](#26.sentence-1)
[🔗](#itemdecl:14)
`template<class charT,
class traits,
class Allocator = allocator<charT>>
explicit basic_string(basic_string_view<charT, traits>, const Allocator& = Allocator())
-> basic_string<charT, traits, Allocator>;
template<class charT,
class traits,
class Allocator = allocator<charT>>
basic_string(basic_string_view<charT, traits>,
typename see below::size_type, typename see below::size_type,
const Allocator& = Allocator())
-> basic_string<charT, traits, Allocator>;
`
[27](#27)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2697)
*Constraints*: Allocator is a type that qualifies as
an allocator ([[container.reqmts]](container.reqmts "23.2.2.2Container requirements"))[.](#27.sentence-1)
[🔗](#lib:operator=,basic_string)
`constexpr basic_string& operator=(const basic_string& str);
`
[28](#28)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2709)
*Effects*: If *this and str are the same object, has no effect[.](#28.sentence-1)
Otherwise, replaces the value of *this with a copy of str[.](#28.sentence-2)
[29](#29)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2714)
*Returns*: *this[.](#29.sentence-1)
[🔗](#lib:operator=,basic_string_)
`constexpr basic_string& operator=(basic_string&& str)
noexcept(allocator_traits<Allocator>::propagate_on_container_move_assignment::value ||
allocator_traits<Allocator>::is_always_equal::value);
`
[30](#30)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2727)
*Effects*: Move assigns as a sequence container ([[sequence.reqmts]](sequence.reqmts "23.2.4Sequence containers")),
except that iterators, pointers and references may be invalidated[.](#30.sentence-1)
[31](#31)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2732)
*Returns*: *this[.](#31.sentence-1)
[🔗](#lib:operator=,basic_string__)
`template<class T>
constexpr basic_string& operator=(const T& t);
`
[32](#32)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2744)
*Constraints*:
- [(32.1)](#32.1)
is_convertible_v<const T&, basic_string_view<charT, traits>> is true and
- [(32.2)](#32.2)
is_convertible_v<const T&, const charT*> is false[.](#32.sentence-1)
[33](#33)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2753)
*Effects*: Equivalent to:basic_string_view<charT, traits> sv = t;return assign(sv);
[🔗](#lib:operator=,basic_string___)
`constexpr basic_string& operator=(const charT* s);
`
[34](#34)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2768)
*Effects*: Equivalent to:return *this = basic_string_view<charT, traits>(s);
[🔗](#lib:operator=,basic_string____)
`constexpr basic_string& operator=(charT c);
`
[35](#35)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2780)
*Effects*: Equivalent to:return *this = basic_string_view<charT, traits>(addressof(c), 1);
[🔗](#lib:operator=,basic_string_____)
`constexpr basic_string& operator=(initializer_list<charT> il);
`
[36](#36)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L2794)
*Effects*: Equivalent to:return *this = basic_string_view<charT, traits>(il.begin(), il.size());