void swap(optional& rhs) noexcept(see below);
Effects: См. Таблицу 39.
*this содержит значение | *this не содержит значения | |
rhs содержит значение | звонки swap(*(*this), *rhs) | инициализирует содержащееся значение, *this как если бы напрямую без списка инициализирует объект типа T с выражением std::move(*rhs), за которым следует rhs.val->T::~T(); постусловие - это то, что *this содержит значение и rhs не содержит значения |
rhs не содержит значения | инициализирует содержащееся значение, rhs как если бы напрямую без списка инициализирует объект типа T с выражением std::move(*(*this)), за которым следует val->T::~T(); постусловие - это то, *this что не содержит значения и rhs содержит значение | нет эффекта |
Remarks: Выражение внутри noexcept эквивалентно:
is_nothrow_move_constructible_v<T> && is_nothrow_swappable_v<T>
Если возникает какое-либо исключение, результаты выражений bool(*this) и bool(rhs) остаются неизменными. Если во время вызова функции возникает исключение swap, состояние *val и *rhs.val определяется гарантией безопасности исключений swap для lvalues T. Если во время вызова Tконструктора перемещения возникает исключение , состояние *val и *rhs.val определяется гарантией безопасности исключений Tконструктора перемещения.