【问题标题】:why using std::move and assign to rvalue does not steal internal content?为什么使用 std::move 并分配给 rvalue 不会窃取内部内容?
【发布时间】:2021-06-10 03:48:08
【问题描述】:

众所周知,如果与非基本类型一起使用,c++ std::move 会窃取内部内容。我突然想到如果将左值移动到右值会发生什么。我最初认为它仍然会窃取内容。但是什么也没发生,a 的字符串还在。这是由于忽略了移动构造函数引起的吗?但我认为一个命名的右值被编译器认为是左值,对吧?

int main()
{
    string a="4";
    string&& c = move(a);
    cout<<a<<endl;
}

【问题讨论】:

  • std::move 是一个演员表。它不会偷任何东西。移动构造函数或移动赋值运算符执行此操作。您的代码也不会调用。

标签: c++ rvalue lvalue stdmove


【解决方案1】:

这是因为 c 被声明为对 a 的引用(右值引用)。它不是一个不同的字符串。为了“静止”(即调用移动构造函数),c 需要声明为string。然后,字符串 a 被“移动”到字符串 c:

int main()
{
    string a="4";
    string c = move(a);
    cout<< "a :" <<a << ":" <<endl;
    
    cout << "c :" << c << ":"<< endl;
}

输出是:

a ::                                                                                                                                           
c :4:

这个代码将一个右值移动到一个左值,这是它应该工作的方式。但是,听起来您正在尝试将左值移动到右值,但这不是您正在做的事情。 c 是一个右值,但 move(a) 也是一个右值。 std::move()a 转换为右值引用。将引用视为类似于指针的东西,它不是string。您不能将字符串移动或复制到其中。它只是指字符串。无论如何,我认为您不能将左值移动到右值。我想不出任何案例。

【讨论】:

  • 如果你有string foo() { return ""; },那么你可以foo() = move(a);。这并没有做任何有用的,但它正在将一个左值移动到一个右值上。
  • @Caleth,并不是因为move(a) 在技术上是一个右值。如果你尝试foo() = a;a 是一个左值,但它是一个副本。无论如何,就像你说的那样,它没有用。
  • move(a) 是一个 xvalue。这是典型的“左值和右值”
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多