Namespaces
Variants

std::basic_string<CharT,Traits,Allocator>:: operator=

From cppreference.net
std::basic_string
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 используя семантику перемещающего присваивания SequenceContainer .
В отличие от других операций перемещения для последовательных контейнеров, ссылки, указатели и итераторы на элементы 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'; // "" или "alpha" (не определено)
    // (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; // эквивалентно str1 = static_cast<char>(35U);
    std::cout << std::quoted(str1) << '\n'; // "#" (ASCII = 35)
}

Возможный вывод:

"alpha" "alpha"
"alpha" ""
"beta"
"!"
"gamma"
"#"

Отчёты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 847 C++98 не было гарантии безопасности исключений добавлена строгая гарантия безопасности исключений
LWG 2063 C++11 оператор перемещающего присваивания не следовал
SequenceContainer семантическим требованиям
следует
LWG 2946 C++17 перегрузка ( 6 ) вызывала неоднозначность в некоторых случаях устранено путем превращения в шаблон

Смотрите также

конструирует basic_string
(публичная функция-член)
присваивает символы строке
(публичная функция-член)
присваивает представление
(публичная функция-член std::basic_string_view<CharT,Traits> )