std::move
ムーブがまだ暗黙的に許可されていない場合 (関数からローカル オブジェクトを返す場合など) 、ムーブ セマンティクスを明示的に許可するために使用できます。
今、私は疑問に思っていました(特に、ローカルリターンとそこへの暗黙的な移動のコンテキストで)、その逆のようなものがあれば、オブジェクトの移動std::move
が妨げられます(ただし、コピーは許可されます)。
これは意味がありますか?
std::move
左辺値を右辺値に変換します。これは本質的に によって行われstatic_cast
ます。反対に考えられるものに最も近いのは、次の 2 つの型キャストです。
static_cast<T &>(/*rvalue-expression*/)
static_cast<const T&>(/*rvalue-expression*/)
この例を以下に示します。
#include <iostream>
void f(const int &)
{ std::cout << "const-lval-ref" << std::endl; }
void f(int &&)
{ std::cout << "rval-ref" << std::endl; }
int main()
{
f(static_cast<const int &>(3));
return 0;
}
prvalue3
を にキャストconst int &
すると、左辺値のオーバーロードが確実にf
選択されます。
ほとんどのコンテキストでは、変数に代入するだけで、この右辺値から左辺値への変更が自動的に取得されます。
int a = 3;
この行の後に使用a
すると、左辺値になります。これはa
、右辺値参照として宣言されている場合でも当てはまります。
int &&a = 3;
ここでも、a
左辺値になります (基本的には「名前がある」ためです)。
明示的なキャストが関連する効果を持つと想像できる唯一の状況は、上記の最初の例です。そして、コピーによる関数呼び出しから返された一時的なような prvalues を扱う場合、正当3
なキャストは const-reference だけです (非 const-reference は prvalue にバインドできません)。