23 General utilities library [utilities]

23.7 Variants [variant]

23.7.3 Class template variant [variant.variant]

23.7.3.6 Swap [variant.swap]

void swap(variant& rhs) noexcept(see below);
Requires: Lvalues of type T shall be swappable ([swappable.requirements]) and is_­move_­constructible_­v<T> shall be true for all i.
Effects:
  • if valueless_­by_­exception() && rhs.valueless_­by_­exception() no effect.
    Otherwise,
  • if index() == rhs.index(), calls swap(get<i>(*this), get<i>(rhs)) where i is index().
    Otherwise,
  • exchanges values of rhs and *this.
Throws: If index() == rhs.index(), any exception thrown by swap(get<i>(*this), get<i>(rhs)) with i being index().
Otherwise, any exception thrown by the move constructor of T or T with i being index() and j being rhs.index().
Remarks: If an exception is thrown during the call to function swap(get<i>(*this), get<i>(rhs)), the states of the contained values of *this and of rhs are determined by the exception safety guarantee of swap for lvalues of T with i being index().
If an exception is thrown during the exchange of the values of *this and rhs, the states of the values of *this and of rhs are determined by the exception safety guarantee of variant's move constructor.
The expression inside noexcept is equivalent to the logical AND of is_­nothrow_­move_­constructible_­v<T> && is_­nothrow_­swappable_­v<T> for all i.