Spec-Zone.ru › C++

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 используя семантику перемещающей присваивания 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'; // "" 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 оператор перемещающего присваивания не соответствовал требованию семантики
SequenceContainer
соответствует
LWG 2946 C++17 перегрузка (6) вызывала неоднозначность в некоторых случаях избегается путём создания шаблона

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/basic_string/operator%3D

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API