namespace std {
template <class T>
void swap(optional<T>& x, optional<T>& y) noexcept(noexcept(x.swap(y)));
}
概要
2つのoptional
オブジェクトを入れ替える。
効果
x.swap(y);
備考
型T
がムーブ構築できない、もしくは型T
がswap可能でない場合、この関数はオーバーロード解決の候補から除外される。
例
#include <cassert>
#include <optional>
int main()
{
// 状況1
// 左辺と右辺の両方が有効値を持つ場合
{
std::optional<int> a = 3;
std::optional<int> b = 1;
// aとbを入れ替える
std::swap(a, b);
assert(a.value() == 1);
assert(b.value() == 3);
}
// 状況2
// 左辺が有効値を持ち、右辺が有効値を持たない場合
{
std::optional<int> a = 3;
std::optional<int> b;
// aとbを入れ替える
std::swap(a, 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を入れ替える
std::swap(a, b);
assert(a.has_value());
assert(a.value() == 3);
assert(!b.has_value());
}
// 状況4
// 左辺と右辺の両方が有効値を持たない場合
{
std::optional<int> a;
std::optional<int> b;
// aとbを入れ替える
std::swap(a, b);
assert(!a.has_value());
assert(!b.has_value());
}
}
出力
バージョン
言語
- C++17
処理系
- Clang: 4.0.1
- GCC: 7.2
- ICC: ??
- Visual C++: ??