std::basic_string<CharT,Traits,Allocator>::operator=
Материал из cppreference.com
<tbody>
</tbody>
basic_string& operator=( const basic_string& str ); |
(1) | (constexpr начиная с C++20) |
basic_string& operator=( basic_string&& str ) noexcept(/* смотрите ниже */); |
(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, используя семантику присваивания перемещением AllocatorAwareContainer. В отличие от других присваиваний перемещением контейнера, ссылки, указатели и итераторы на 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{"альфа"};
// (1) operator=(const basic_string&);
str1 = str2;
std::cout << std::quoted(str1) << ' ' // "альфа"
<< std::quoted(str2) << '\n'; // "альфа"
// (2) operator=(basic_string&&);
str1 = std::move(str2);
std::cout << std::quoted(str1) << ' ' // "альфа"
<< std::quoted(str2) << '\n'; // "" или "альфа" (не указано)
// (3) operator=(const CharT*);
str1 = "бета";
std::cout << std::quoted(str1) << '\n'; // "бета"
// (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; // эквивалентно str1 = static_cast<char>(35U);
std::cout << std::quoted(str1) << '\n'; // "#" (ASCII = 35)
}
Возможный вывод:
"альфа" "альфа"
"альфа" ""
"бета"
"!"
"gamma"
"#"
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 847 | C++98 | не было гарантии безопасности исключений | добавлена надёжная гарантия безопасности исключений |
| LWG 2063 | C++11 | оператор присваивания перемещением не соответствует семантическим требованиям AllocatorAwareContainer |
соответствует |
| LWG 2946 | C++17 | перегрузка (6) в некоторых случаях вызывала двусмысленность | исправлено, сделав её шаблоном |
Смотрите также
создаёт basic_string (public функция-элемент) | |
| присваивает символы строке (public функция-элемент) | |
(C++17) |
присваивает представлению (public функция-элемент std::basic_string_view<CharT,Traits>)
|