std::move 的逆函数是否存在?

Mar*_* Ba 6 c++ move-semantics c++11

std::move当移动尚未被隐式允许时(例如通常从函数返回本地对象时),可用于显式允许移动语义。

现在,我想知道(特别是在本地返回和隐式移动的情况下),是否存在与此相反的东西std::move阻止移动对象(但仍然允许复制)。

这还有道理吗?

jog*_*pan 4

std::move将左值转换为右值,它本质上是通过 来完成的static_cast。我能想到的最接近相反的是这两种类型转换:

static_cast<T &>(/*rvalue-expression*/)
static_cast<const T&>(/*rvalue-expression*/)
Run Code Online (Sandbox Code Playgroud)

下面是一个例子:

#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;
}
Run Code Online (Sandbox Code Playgroud)

转换纯右值3const int &确保选择 的左值重载f

在大多数情况下,只需分配给变量即可自动获得右值到左值的修改:

int a = 3;
Run Code Online (Sandbox Code Playgroud)

当您在该行之后使用时a,它将是一个左值。即使被声明为右值引用也是如此a

int &&a = 3;
Run Code Online (Sandbox Code Playgroud)

这里也a成为左值(基本上是因为它“有一个名字”)。

我可以想象显式强制转换具有任何相关效果的唯一情况是上面的第一个示例。在那里,当处理纯右值3或通过复制从函数调用返回的临时值时,唯一合法的转换是 const 引用(不允许非 const 引用绑定到纯右值)。