0

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

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

1 回答 1

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

于 2021-03-12T05:32:32.407 回答