std::expected<T,E>::swap
来自cppreference.com
constexpr void swap( expected& other ) noexcept(/*见下文*/); |
(C++23 起) | |
与 other
的内容交换。
- 如果
this->has_value()
和other.has_value()
都为真:
- 如果
T
是(可能带有 cv 限定的)void,则无效果。 - 否则,等价于 using std::swap; swap(*this, other);。
- 如果
- 如果
this->has_value()
和other.has_value()
都为假,等价于
using std::swap; swap(this->error(), other.error());。 - 如果
this->has_value()
为假而other.has_value()
为真,调用 other.swap(*this)。 - 如果
this->has_value()
为真而other.has_value()
为假,
- 如果
T
是(可能带有 cv 限定的)void,令 unex 为表示意外值的成员,等价于:
- 如果
std::construct_at(std::addressof(unex), std::move(other.unex)); std::destroy_at(std::addressof(other.unex));
- 否则,令 val为表示期望值的成员,而 unex 为表示意外值的成员,等价于:
if constexpr (std::is_nothrow_move_constructible_v<E>) { E temp(std::move(other.unex)); std::destroy_at(std::addressof(other.unex)); try { std::construct_at(std::addressof(other.val), std::move(val)); std::destroy_at(std::addressof(val)); std::construct_at(std::addressof(unex), std::move(temp)); } catch(...) { std::construct_at(std::addressof(other.unex), std::move(temp)); throw; } } else { T temp(std::move(val)); std::destroy_at(std::addressof(val)); try { std::construct_at(std::addressof(unex), std::move(other.unex)); std::destroy_at(std::addressof(other.unex)); std::construct_at(std::addressof(other.val), std::move(temp)); } catch(...) { std::construct_at(std::addressof(val), std::move(temp)); throw; } }
- 在任何情况下,如果没有抛出异常,在交换后
this->has_value()
为假,而other.has_value()
为真。
- 在任何情况下,如果没有抛出异常,在交换后
此函数仅在以下条件满足时参与重载解析:
-
T
是(可能带有 cv 限定的)void,或者 std::is_swappable_v<T> 为真,和 - std::is_swappable_v<E> 为真,和
-
T
是(可能带有cv限定符的)void,或者std::is_move_constructible_v<T>为真,和 - std::is_move_constructible_v<E> 为真,和
- 以下至少有一个为真:
-
T
是(可能带有 cv 限定的)void - std::is_nothrow_move_constructible_v<T>
- std::is_nothrow_move_constructible_v<E>
-
参数
other | - | 要与之交换内容的 optional 对象
|
返回值
(无)
异常
如果T
是(可能带有 cv 限定的)void,则 noexcept 说明:
否则,noexcept(
std::is_nothrow_move_constructible_v<E> && std::is_nothrow_swappable_v<E>
noexcept 说明:
noexcept(
std::is_nothrow_move_constructible_v<T> && std::is_nothrow_swappable_v<T> &&
std::is_nothrow_move_constructible_v<E> && std::is_nothrow_swappable_v<E>
在抛出异常的情况下,*this 和 other
的包含值的状态由 swap
或 T
和 E
的移动构造函数的异常安全保证决定,取决于哪个被调用。对于 *this 和 other
,如果对象包含了期望值,它就保留期望值,反之亦然。
示例
本节未完成 原因:暂无示例 |
参阅
(C++23) |
特化 std::swap 算法 (函数) |