C++ の名前付き要件: MoveConstructible (C++11 以降)
From cppreference.com
型のインスタンスが 右辺値 引数から構築できることを指定します。
目次 |
[編集] 要件
型 T が MoveConstructible を満たすのは、
以下を考えます。
- 型
Tの 右辺値 式であるrv、 - 任意の識別子である
uがある場合です。
以下の式は有効であり、指定された効果を持つ必要があります。
| Expression | 事後条件 |
|---|---|
| T u = rv; | u の値は、初期化前の rv の値と同等です。
|
| T(rv) | T(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++11)(C++11)(C++11) |
型が右辺値参照から構築可能であるかをチェックする (クラステンプレート) |
| (C++20) |
その型のオブジェクトがムーブ構築可能であることを規定する (コンセプト) |