std::experimental::optional<T>::operator=
來自 cppreference.com
< cpp | experimental | optional
optional& operator=( std::experimental::nullopt_t ) noexcept; |
(1) | (庫基礎 TS) |
optional& operator=( const optional& other ); |
(2) | (庫基礎 TS) |
optional& operator=( optional&& other ) noexcept(/* 參見下文 */); |
(3) | (庫基礎 TS) |
template< class U > optional& operator=( U&& value ); |
(4) | (庫基礎 TS) |
用 other 的內容替換 *this 的內容。
1) 若 *this 在呼叫前含值,則透過呼叫其解構函式,如同 val->T::~T() 一般銷燬所含值。此呼叫後 *this 不含值。
2,3) 賦值 other 的狀態。
- 若 *this 和 other 均不含值,則函式無效果。
- 若 *this 含值但 other 不含值,則透過呼叫其解構函式銷燬所含值。此呼叫後 *this 不含值。
- 若 other 含值,則根據 *this 是否含值,所含值要麼被 直接初始化,要麼從 *other (2) 或 std::move(*other) (3) 賦值。注意,被移動的 optional 仍_含值_。
4) 僅進行衰退的完美轉發賦值:根據 *this 在呼叫前是否含值,所含值要麼從 std::forward<U>(value) 直接初始化,要麼從 std::forward<U>(value) 賦值。除非 std::is_same<std::decay_t<U>, T>::value 為 true,否則函式不參與過載決議。
目錄 |
[編輯] 引數
其他 | - | another optional 物件,其包含的值將被賦值 |
value | - | 要賦值給包含值的值 |
型別要求 | ||
-為使用過載 (2),T 必須滿足 可複製賦值 (CopyAssignable) 和 可複製構造 (CopyConstructible) 的要求。 | ||
-為使用過載 (3),T 必須滿足 可移動賦值 (MoveAssignable) 和 可移動構造 (MoveConstructible) 的要求。 |
[編輯] 返回值
*this
[編輯] 異常
2-4) 丟擲由
(3) 具有以下
T
的建構函式或賦值運算子丟擲的任何異常。若丟擲異常,*this (以及在 (2) 的情況下為 other)的初始化狀態保持不變,即如果物件包含值,它仍然包含值,反之亦然。value 的內容以及 *this 和 other 的包含值取決於異常起源操作(複製建構函式、移動賦值等)的異常安全保證。(3) 具有以下
noexcept
宣告noexcept 規範:
noexcept(std::is_nothrow_move_assignable<T>::value && std::is_nothrow_move_constructible<T>::value)
[編輯] 注意
一個 optional 物件 op
可以透過 op = {}; 和 op = nullopt; 變為一個空的 optional。
[編輯] 示例
執行此程式碼
#include <experimental/optional> #include <iostream> int main() { std::experimental::optional<const char*> s1 = "abc", s2; // constructor s2 = s1; // assignment s1 = "def"; // decaying assignment (U = char[4], T = const char*) std::cout << *s2 << ' ' << *s1 << '\n'; }
輸出
abc def
[編輯] 參閱
就地構造包含的值 (public 成員函式) |