为什么使用 std::move 并分配给 rvalue 不会窃取内部内容?

问题描述

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

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

解决方法

这是因为 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。您不能将字符串移动或复制到它。它只是指字符串。无论如何,我不认为您可以将左值移动到右值。我想不出任何情况。