std::optional<T>::swap
void swap( optional& other ) noexcept(/* see below */); |
(с C++17) (до C++20) | |
constexpr void swap( optional& other ) noexcept(/* see below */); | (с 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).Tlvalues должны удовлетворять требованиям Swappable.
Программа некорректна, если std::is_move_constructible_v<T> является false.
Параметры
| other | - | объект optional для обмена содержимым |
Возвращаемое значение
(нет)
Исключения
noexcept спецификация: noexcept(std::is_nothrow_move_constructible_v<T> &&
std::is_nothrow_swappable_v<T>)В случае выбрасывания исключения состояния содержащихся значений *this и other определяются гарантиями исключительной безопасности swap типа T или конструктором перемещения T, который вызывается. Для *this и other, если объект содержал значение, оно остаётся содержащим значение, и наоборот.
Пример
#include <iostream>
#include <string>
#include <optional>
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++.
| DR | Применимо к | Поведение, опубликованное | Правильное поведение |
|---|---|---|---|
| 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/w/cpp/utility/optional/swap