std::basic_string<CharT,Traits,Allocator>::operator=
basic_string& operator=( const basic_string& str ); | (1) | (constexpr с C++20) |
basic_string& operator=( basic_string&& str )
noexcept(/* see below */);
| (2) |
(с C++11) (constexpr с C++20) |
basic_string& operator=( const CharT* s ); | (3) | (constexpr с C++20) |
basic_string& operator=( CharT ch ); | (4) | (constexpr с C++20) |
basic_string& operator=( std::initializer_list<CharT> ilist ); | (5) |
(с C++11) (constexpr с C++20) |
template<class StringViewLike> basic_string& operator=( const StringViewLike& t ); | (6) |
(с C++17) (constexpr с C++20) |
basic_string& operator=( std::nullptr_t ) = delete; | (7) | (с C++23) |
Заменяет содержимое строки.
1) Заменяет содержимое копией
str. Если *this и str являются одним и тем же объектом, эта функция ничего не делает.
2) Заменяет содержимое содержимым
str, используя семантику перемещающего присваивания контейнера последовательности.
В отличие от перемещающего присваивания других контейнеров последовательностей, ссылки, указатели и итераторы на элементы
str могут стать недействительными.
3) Заменяет содержимое содержимым строки символов с завершающим нулём, на которую указывает
s, как если бы выполнялось assign(s, Traits::length(s)).
4) Заменяет содержимое символом
ch, как если бы выполнялось assign(std::addressof(ch), 1).
5) Заменяет содержимое элементами списка инициализации
ilist, как если бы выполнялось assign(ilist.begin(), ilist.size()).
6) Неявно преобразует
t в строковое представление sv, как если бы выполнялось std::basic_string_view<CharT, Traits> sv = t;, а затем заменяет содержимое содержимым sv, как если бы выполнялось assign(sv).
Эта перегрузка участвует в разрешении перегрузки, только если
std::is_convertible_v<const StringViewLike&,std::basic_string_view<CharT, Traits>> является true и std::is_convertible_v<const StringViewLike&, const CharT*> является false.
7)
std::basic_string нельзя присвоить значение из nullptr.Параметры
| ch | - | значение, которым инициализируются символы строки |
| str | - | строка, используемая в качестве источника для инициализации строки |
| s | - | указатель на строку символов с завершающим нулём, используемую в качестве источника для инициализации строки |
| ilist | - |
std::initializer_list для инициализации строки |
| t | - | объект, преобразуемый в std::basic_string_view для инициализации строки |
Возвращаемое значение
*this
Сложность
1) Линейная относительно размера
str.
2) Линейная относительно размера
*this (формально, каждый CharT должен быть уничтожен). Если аллокаторы не равны и не распространяются, сложность также линейна относительно размера str (необходимо создать копию).
3) Линейная относительно размера
s.
4) Константная.
5) Линейная относительно размера
ilist.
6) Линейная относительно размера
t.Исключения
2)
noexcept спецификация: noexcept(std::allocator_traits<Allocator>::
propagate_on_container_move_assignment::value ||
std::allocator_traits<Allocator>::is_always_equal::value)
Если операция приведёт к тому, что size() превысит max_size(), выбрасывается std::length_error.
Если по какой-либо причине выбрасывается исключение, эта функция не оказывает никакого эффекта (гарантия строгой безопасности при исключениях).
Пример
#include <iomanip>
#include <iostream>
#include <string>
int main()
{
std::string str1;
std::string str2{"alpha"};
// (1) operator=(const basic_string&);
str1 = str2;
std::cout << std::quoted(str1) << ' ' // "alpha"
<< std::quoted(str2) << '\n'; // "alpha"
// (2) operator=(basic_string&&);
str1 = std::move(str2);
std::cout << std::quoted(str1) << ' ' // "alpha"
<< std::quoted(str2) << '\n'; // "" or "alpha" (unspecified)
// (3) operator=(const CharT*);
str1 = "beta";
std::cout << std::quoted(str1) << '\n'; // "beta"
// (4) operator=(CharT);
str1 = '!';
std::cout << std::quoted(str1) << '\n'; // "!"
// (5) operator=(std::initializer_list<CharT>);
str1 = {'g', 'a', 'm', 'm', 'a'};
std::cout << std::quoted(str1) << '\n'; // "gamma"
// (6) operator=(const T&);
str1 = 35U; // equivalent to str1 = static_cast<char>(35U);
std::cout << std::quoted(str1) << '\n'; // "#" (ASCII = 35)
}
Возможный вывод:
"alpha" "alpha" "alpha" "" "beta" "!" "gamma" "#"
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение согласно опубликованной редакции | Правильное поведение |
|---|---|---|---|
| LWG 847 | C++98 | гарантия безопасности при исключениях отсутствовала | добавлена гарантия строгой безопасности при исключениях |
| LWG 2063 | C++11 | оператор перемещающего присваивания не соответствовал семантическому требованию контейнера последовательности | соответствует |
| LWG 2946 | C++17 | перегрузка (6) в некоторых случаях вызывала неоднозначность | проблема устранена превращением её в шаблон |
См. также
создаёт basic_string (открытая функция-член) |
|
| присваивает символы строке (открытая функция-член) |
|
| присваивает представление (открытая функция-член std::basic_string_view<CharT,Traits>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/basic_string/operator%3D