Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
Функции-элементы
basic_string::operator=
Доступ к элементам
Итераторы
Ёмкость
Операции
Поиск
Константы
Правила вывода (C++17)
Функции, не являющиеся элементами
Ввод/Вывод
Сравнение
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
Числовые преобразования
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Вспомогательные классы
 
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>) [править]