23 General utilities library [utilities]

23.6 Optional objects [optional]

23.6.3 Class template optional [optional.optional]

23.6.3.4 Swap [optional.swap]

void swap(optional& rhs) noexcept(see below);

Requires: Lvalues ​​типа T должны быть заменяемыми и is_­move_­constructible_­v<T> есть true.

Effects: См. Таблицу 39.

Таблица 39 - optional​::​swap(optional&) эффекты
*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 содержит значение нет эффекта

Throws: Любые исключения, вызванные операциями в соответствующей части таблицы 39.

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конструктора перемещения.