std::inplace_vector<T,N>::operator=
С ru.cppreference.net
constexpr inplace_vector& operator=( const inplace_vector& other );
|
(1) | (начиная с C++26) |
constexpr inplace_vector& operator=( inplace_vector&& other )
noexcept(/* see below */);
|
(2) | (начиная с C++26) |
constexpr inplace_vector& operator=( std::initializer_list<T> init );
|
(3) | (начиная с C++26) |
Заменяет содержимое inplace_vector.\n
1) Оператор копирующего присваивания. Заменяет содержимое копией содержимого
other. Этот оператор является тривиальным, если
std::inplace_vector<T, N> имеет тривиальный деструктор, а std::is_trivially_copy_constructible_v<T> && std::is_trivially_copy_assignable_v<T> является true.2) Оператор перемещающего присваивания. Заменяет содержимое содержимым
other, используя семантику перемещения (т.е. данные в other перемещаются из other в этот контейнер). other после этого находится в корректном, но неопределённом состоянии. Этот оператор является тривиальным, если
std::inplace_vector<T, N> имеет тривиальный деструктор, а std::is_trivially_move_constructible_v<T> && std::is_trivially_move_assignable_v<T> является true.3) Заменяет содержимое содержимым, указанным в списке инициализации
init.Параметры
| other | - |
другой
inplace_vector
для использования в качестве источника для инициализации элементов контейнера
|
| init | - | список инициализации для инициализации элементов контейнера |
Сложность
1,2)
Линейно относительно размера
*
this
и
other
.
3)
Линейно по размеру
*
this
и
init
.
Исключения
2)
noexcept
спецификация:
noexcept
(
N
==
0
||
(
std::
is_nothrow_move_assignable_v
<
T
>
&&
Пример
Запустить этот код
#include <initializer_list> #include <inplace_vector> #include <new> #include <print> #include <ranges> #include <string> int main() { std::inplace_vector<int, 4> x({1, 2, 3}), y; std::println("Изначально:"); std::println("x = {}", x); std::println("y = {}", y); std::println("Копирующее присваивание копирует данные из x в y:"); y = x; // перегрузка (1) std::println("x = {}", x); std::println("y = {}", y); std::inplace_vector<std::string, 3> z, w{"\N{CAT}", "\N{GREEN HEART}"}; std::println("Изначально:"); std::println("z = {}", z); std::println("w = {}", w); std::println("Перемещающее присваивание перемещает данные из w в z:"); z = std::move(w); // перегрузка (2) std::println("z = {}", z); std::println("w = {}", w); // w находится в допустимом, но неопределенном состоянии auto l = {4, 5, 6, 7}; std::println("Присваивание initializer_list {} в x:", l); x = l; // перегрузка (3) std::println("x = {}", x); std::println("Присваивание initializer_list с размером больше N вызывает исключение:"); try { x = {1, 2, 3, 4, 5}; // исключение: (размер initializer list == 5) > (емкость N == 4) } catch(const std::bad_alloc& ex) { std::println("ex.what(): {}", ex.what()); } }
Возможный вывод:
Изначально: x = [1, 2, 3] y = [] Копирующее присваивание копирует данные из x в y: x = [1, 2, 3] y = [1, 2, 3] Изначально: z = [] w = ["🐈", "💚"] Перемещающее присваивание перемещает данные из w в z: z = ["🐈", "💚"] w = ["", ""] Присваивание initializer_list [4, 5, 6, 7] в x: x = [4, 5, 6, 7] Присваивание initializer_list с размером больше N вызывает исключение: ex.what(): std::bad_alloc
Смотрите также
конструирует
inplace_vector
(public member function) |
|
|
присваивает значения контейнеру
(public member function) |