std::list<T,Allocator>::operator=
list& operator=( const list& other ); |
(1) | |
| (2) | ||
list& operator=( list&& other ); |
(с C++11) (до C++17) |
|
list& operator=( list&& other ) noexcept(/* see below */); |
(с C++17) | |
list& operator=( std::initializer_list<T> ilist ); |
(3) | (с C++11) |
Заменяет содержимое контейнера.
other. | Если |
(с C++11) |
other с использованием семантики перемещения (т.е. данные из other перемещаются из other в этот контейнер). other после этого находится в корректном, но неопределённом состоянии.std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value является true, выделенщик *this заменяется копией выделенщика other. Если это false и выделенщики *this и other не равны, *this не может принять во владение память, принадлежащую other, и должен выполнить перемещающее присваивание каждого элемента индивидуально, выделяя дополнительную память при необходимости с помощью своего собственного выделенщика. В любом случае, все элементы, изначально принадлежащие *this, либо уничтожаются, либо заменяются перемещающим присваиванием по элементам.ilist.
Параметры
| other | - | другой контейнер, используемый как источник данных |
| ilist | - | список инициализации, используемый как источник данных |
Значение возврата
*this
Сложность
*this и other.
*this, если выделенщики не равны и не распространяются, в противном случае линейная по размеру *this и other.
*this и ilist.
Исключения
| Может бросить исключения, определённые реализацией. |
(до C++17) |
1,3) Может бросить исключения, определённые реализацией. 2) noexcept спецификация: noexcept(std::allocator_traits<Allocator>::is_always_equal::value) |
(с C++17) |
Примечания
После присваивания по перемещению контейнера (перегрузка (2)), если присваивание по перемещению элементов не вынуждено несовместимыми выделенщиками, ссылки, указатели и итераторы (кроме конечной итератора) к other остаются действительными, но ссылаются на элементы, которые сейчас находятся в *this. Текущий стандарт даёт это гарантию в виде общего заявления в [container.reqmts]/67, и более прямая гарантия рассматривается в LWG issue 2321.
Пример
Следующий код использует operator= для присваивания одного std::list другому:
#include <initializer_list>
#include <iostream>
#include <iterator>
#include <list>
void print(auto const comment, auto const& container)
{
auto size = std::size(container);
std::cout << comment << "{ ";
for (auto const& element : container)
std::cout << element << (--size ? ", " : " ");
std::cout << "}\n";
}
int main()
{
std::list<int> x{1, 2, 3}, y, z;
const auto w = {4, 5, 6, 7};
std::cout << "Initially:\n";
print("x = ", x);
print("y = ", y);
print("z = ", z);
std::cout << "Copy assignment copies data from x to y:\n";
y = x;
print("x = ", x);
print("y = ", y);
std::cout << "Move assignment moves data from x to z, modifying both x and z:\n";
z = std::move(x);
print("x = ", x);
print("z = ", z);
std::cout << "Assignment of initializer_list w to z:\n";
z = w;
print("w = ", w);
print("z = ", z);
}Вывод:
Initially:
x = { 1, 2, 3 }
y = { }
z = { }
Copy assignment copies data from x to y:
x = { 1, 2, 3 }
y = { 1, 2, 3 }
Move assignment moves data from x to z, modifying both x and z:
x = { }
z = { 1, 2, 3 }
Assignment of initializer_list w to z:
w = { 4, 5, 6, 7 }
z = { 4, 5, 6, 7 }См. также
создаёт list (публичный член-функция) |
|
| присваивает значения контейнеру (публичный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/list/operator%3D