C++ 命名要求: MoveConstructible (自 C++11 起)
來自 cppreference.com
指定該型別的例項可以由右值實參構造。
目錄 |
[編輯] 要求
型別 T
滿足 MoveConstructible,如果
給定
-
rv
,一個型別為T
的右值表示式, -
u
,一個任意識別符號。
以下表達式必須有效並具有其指定的效果。
表示式 | 後置條件 |
---|---|
T u = rv; | u 的值等同於初始化前 rv 的值。
|
T(rv) | T(rv) 的值等同於初始化前 rv 的值。
|
[編輯] 注意
一個類不需要實現移動建構函式來滿足此型別要求:一個接受 const T&
引數的複製建構函式可以繫結右值表示式。
如果一個 MoveConstructible 類實現了一個移動建構函式,它也可以實現移動語義,以利用構造後 rv
的值未指定的事實。
擴充套件內容 |
---|
作為 MoveConstructible 類意味著 std::is_move_constructible,但反之則不然,因為 std::is_move_constructible 只檢查使用正確引數呼叫建構函式的能力,而不檢查後置條件值。 執行此程式碼 #include <iostream> struct S { int n; S(int in) : n{in} {} S(S&& other) { n = other.n + 1; } }; static_assert(std::is_move_constructible_v<S>); int main() { S v{1}; std::cout << "v.n = " << v.n << '\n'; S u = std::move(v); // Class `S` doesn't satisfy a MoveConstructible requirement // The value of `u` is NOT equivalent to the value of `v` before the `u` initialization std::cout << "u.n = " << u.n << '\n'; } 輸出 v.n = 1 u.n = 2 |
[編輯] 參考
擴充套件內容 |
---|
|
[編輯] 另請參閱
(C++11)(C++11)(C++11) |
檢查型別是否可以從右值引用構造 (類模板) |
(C++20) |
指定型別的物件可以被移動構造 (概念) |