std::optional<T>::swap
void swap( optional& other ) noexcept(/* see below */); | (начиная с C++17) (constexpr начиная с C++20) |
Обменивает содержимое с содержимым other.
- Если ни
*this, ниotherне содержат значения, функция ничего не делает. - Если значение содержит только один из объектов —
*thisилиother(назовём этот объектin, а другой —un), содержащееся значениеunинициализируется непосредственно изstd::move(*in), после чего содержащееся значениеinуничтожается, как если бы был вызванin->T::~T(). После этого вызоваinне содержит значения;unсодержит значение. - Если значения содержат оба объекта —
*thisиother, содержащиеся значения обмениваются вызовомusing std::swap; swap(**this, *other).
Программа некорректна, если тип T не является обмениваемым или std::is_move_constructible_v<T> не является true.
Параметры
| other | - | объект типа optional, с которым нужно обменять содержимое |
Возвращаемое значение
(нет)
Исключения
noexcept: noexcept(std::is_nothrow_move_constructible_v<T> &&
std::is_nothrow_swappable_v<T>)
В случае выброса исключения состояния содержащихся значений *this и other определяются гарантиями безопасности при исключениях, предоставляемыми swap типа T или конструктором перемещения T — в зависимости от того, какой из них вызывается. Для обоих объектов, *this и other, если объект содержал значение, он продолжает содержать значение, и наоборот.
Примечания
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_optional | 202106L |
(C++20) (DR20) | Полностью constexpr |
Пример
#include <iostream>
#include <optional>
#include <string>
int main()
{
std::optional<std::string> opt1("First example text");
std::optional<std::string> opt2("2nd text");
enum Swap { Before, After };
auto print_opts = [&](Swap e)
{
std::cout << (e == Before ? "Before swap:\n" : "After swap:\n");
std::cout << "opt1 contains '" << opt1.value_or("") << "'\n";
std::cout << "opt2 contains '" << opt2.value_or("") << "'\n";
std::cout << (e == Before ? "---SWAP---\n": "\n");
};
print_opts(Before);
opt1.swap(opt2);
print_opts(After);
// Swap with only 1 set
opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt.";
opt2.reset();
print_opts(Before);
opt1.swap(opt2);
print_opts(After);
}
Вывод:
Before swap: opt1 contains 'First example text' opt2 contains '2nd text' ---SWAP--- After swap: opt1 contains '2nd text' opt2 contains 'First example text' Before swap: opt1 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.' opt2 contains '' ---SWAP--- After swap: opt1 contains '' opt2 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| P2231R1 | C++20 |
swap не был constexpr, хотя необходимые операции могут быть constexpr в C++20 | сделан constexpr |
См. также
|
(C++17) | специализация алгоритма std::swap (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/optional/swap