std::optional<T>::swap
From cppreference.com
| void swap( optional& other ) noexcept(/* 以下の通り */); |
(C++17以降) (C++20 以降 constexpr) |
|
other の内容と内容を交換します。
*thisとotherのどちらも値を保持していない場合、この関数は何も行いません。
*thisとotherのどちらか一方のみが値を保持している場合(このオブジェクトをin、もう一方をunと呼びます)、unが保持している値はstd::move(*in)から直接初期化され、その後、inが保持している値はin->T::~T()が呼び出されたかのように破棄されます。この呼び出しの後、inは値を保持しなくなり、unは値を保持します。
*thisとotherの両方が値を保持している場合、保持している値はusing std::swap; swap(**this, *other)を呼び出すことによって交換されます。
型 T が Swappable であり、std::is_move_constructible_v<T> が true でない限り、プログラムは不正形式です。
目次 |
[編集] Parameters
| その他 | - | 内容を交換する optional オブジェクト |
[編集] Return value
(なし)
[編集] Exceptions
noexcept 指定:
noexcept(std::is_nothrow_move_constructible_v<T> &&
std::is_nothrow_swappable_v<T>)
std::is_nothrow_swappable_v<T>)
例外がスローされた場合、*this と other が保持していた値の状態は、呼び出された型 T の swap または T のムーブコンストラクタの例外安全保証によって決定されます。*this と other の両方について、オブジェクトが値を保持していた場合は値を保持したままとなり、そうでない場合はそうでないままとなります。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_optional |
202106L |
(C++20) (DR20) |
完全な constexpr |
[編集] Example
このコードを実行
#include <iostream> #include <optional> #include <string> int main() { std::optional<std::string> opt1("First example text"); std::optional<std::string> opt2("2nd text"); enum Swap { Before, After }; auto print_opts = [&](Swap e) { std::cout << (e == Before ? "Before swap:\n" : "After swap:\n"); std::cout << "opt1 contains '" << opt1.value_or("") << "'\n"; std::cout << "opt2 contains '" << opt2.value_or("") << "'\n"; std::cout << (e == Before ? "---SWAP---\n": "\n"); }; print_opts(Before); opt1.swap(opt2); print_opts(After); // Swap with only 1 set opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt."; opt2.reset(); print_opts(Before); opt1.swap(opt2); print_opts(After); }
出力
Before swap: opt1 contains 'First example text' opt2 contains '2nd text' ---SWAP--- After swap: opt1 contains '2nd text' opt2 contains 'First example text' Before swap: opt1 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.' opt2 contains '' ---SWAP--- After swap: opt1 contains '' opt2 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
[編集] Defect reports
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2231R1 | C++20 | C++20 では必要な操作は constexpr にできるにもかかわらず、swap は constexpr ではありませんでした。 |
constexprではありませんでした。 |
[編集] See also
| (C++17) |
std::swap アルゴリズムを特殊化する (function template) |