Namespaces
Variants

C++ named requirements: MoveConstructible (since C++11)

From cppreference.net
C++ named requirements

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

目录

要求

类型 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);
    // 类`S`不满足MoveConstructible要求
    // `u`的值与初始化前`v`的值不等价
    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]

另请参阅

检查类型是否可以从右值引用构造
(类模板)
规定该类型的对象可以移动构造
(概念)