名稱空間
變體
操作

C++ 命名要求: MoveConstructible (自 C++11 起)

來自 cppreference.com
 
 
C++ 命名要求
基本
MoveConstructible(可移動構造)
(C++11)
型別屬性
全庫範圍




Container(容器)
容器元素
迭代器 (Iterator)
流 I/O
格式化器
隨機數
併發
範圍(Ranges)
多維檢視
其他

 

指定該型別的例項可以由右值實參構造。

目錄

[編輯] 要求

型別 T 滿足 MoveConstructible,如果

給定

  • rv,一個型別為 T右值表示式,
  • u,一個任意識別符號。

以下表達式必須有效並具有其指定的效果。

表示式 後置條件
T u = rv; u 的值等同於初始化前 rv 的值。

rv 的新值未指定。

T(rv) T(rv) 的值等同於初始化前 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++23 標準 (ISO/IEC 14882:2024)
  • 16.4.4.2 模板引數要求 [utility.arg.requirements]

[編輯] 另請參閱

檢查型別是否可以從右值引用構造
(類模板) [編輯]
指定型別的物件可以被移動構造
(概念) [編輯]