- optional[meta header]
- std[meta namespace]
- optional[meta class]
- function[meta id-type]
- cpp17[meta cpp]
void swap(optional& rhs) noexcept(see below); // C++17
constexpr void swap(optional& rhs) noexcept(see below); // C++23- see below[italic]
他のoptionalオブジェクトとデータを入れ替える。
- 型
Tがswap可能であること - 型
Tがムーブ構築可能であること
*thisとrhsがどちらも有効値を保持している場合、swap(value(), rhs.value())を呼び出す*thisが有効値を保持しておらず、rhsが有効値を保持している場合、rhsが持つ有効値を*thisにムーブ代入し、rhsをreset()メンバ関数で無効値の状態にする*thisが有効値を保持しており、rhsが有効値を保持していない場合、*thisが持つ有効値をrhsにムーブ代入し、*thisをreset()メンバ関数で無効値の状態にする*thisとrhsどちらも有効値を保持していない場合、なにもしない
効果の項での操作が、任意の例外を送出する可能性がある。ただし、型Tが、例外を送出しないムーブ構築と、例外を送出しないswap操作ができる場合、この関数は決して例外を送出しない。
この関数で例外が送出された場合、this->has_value()とrhs.has_value()の状態は変わらない。
この関数内で、有効値に対するswap関数の呼び出しで例外が送出された場合、this->value()とrhs.value()は、そのswap関数の例外安全性が保証する状態となる。
この関数内で、型Tのムーブコンストラクタで例外が送出された場合、this->value()とrhs.value()は、そのムーブコンストラクタの例外安全性が保証する状態となる。
#include <cassert>
#include <optional>
int main()
{
// 状況1
// 左辺と右辺の両方が有効値を持つ場合
{
std::optional<int> a = 3;
std::optional<int> b = 1;
// aとbを入れ替える
a.swap(b);
assert(a.value() == 1);
assert(b.value() == 3);
}
// 状況2
// 左辺が有効値を持ち、右辺が有効値を持たない場合
{
std::optional<int> a = 3;
std::optional<int> b;
// aとbを入れ替える
a.swap(b);
assert(!a.has_value());
assert(b.has_value());
assert(b.value() == 3);
}
// 状況3
// 左辺が有効値を持たず、右辺が有効値を持つ場合
{
std::optional<int> a;
std::optional<int> b = 3;
// aとbを入れ替える
a.swap(b);
assert(a.has_value());
assert(a.value() == 3);
assert(!b.has_value());
}
// 状況4
// 左辺と右辺の両方が有効値を持たない場合
{
std::optional<int> a;
std::optional<int> b;
// aとbを入れ替える
a.swap(b);
assert(!a.has_value());
assert(!b.has_value());
}
}- swap[color ff0000]
- has_value()[link has_value.md]
- value()[link value.md]
- C++17
- Clang: 4.0.1
- GCC: 7.2
- ICC: ??
- Visual C++: ??