名前空間
変種
操作

C++ の名前付き要件: MoveConstructible (C++11 以降)

From cppreference.com
 
 
C++ 名前付き要件
 

型のインスタンスが 右辺値 引数から構築できることを指定します。

目次

[編集] 要件

TMoveConstructible を満たすのは、

以下を考えます。

  • T右辺値 式である rv
  • 任意の識別子である u がある場合です。

以下の式は有効であり、指定された効果を持つ必要があります。

Expression 事後条件
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]

[編集] 関連項目

型が右辺値参照から構築可能であるかをチェックする
(クラステンプレート) [編集]
その型のオブジェクトがムーブ構築可能であることを規定する
(コンセプト) [編集]
English 日本語 中文(简体) 中文(繁體)