命名空间
变体
操作

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

来自 cppreference.com
 
 
C++ 命名需求
 

指定该类型的实例可以从一个右值参数构造。

内容

[编辑] 需求

如果类型 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]

[编辑] 另请参见

检查类型是否可以从右值引用构造
(类模板) [编辑]
指定类型对象可以移动构造
(概念) [编辑]