C++ 具名要求:可移动构造 (MoveConstructible) (C++11 起)

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

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

要求

以下情况下,类型 T 满足可移动构造 (MoveConstructible)

给定

下列表达式必须合法且拥有其指定的效果。

表达式 后条件
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` 在初始化 `u` 之前的值
    std::cout << "u.n = " << u.n << '\n';
}

输出:

v.n = 1
u.n = 2

引用

延伸内容
  • C++23 标准(ISO/IEC 14882:2024):
  • 16.4.4.2 Template argument requirements [utility.arg.requirements]

参阅

检查类型是否能从右值引用构造
(类模板)
指定能移动构造一个类型的对象
(概念)