众所周知,如果与非基本类型一起使用,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
. 您不能将字符串移动或复制到其中。它只是指字符串。无论如何,我认为您不能将左值移动到右值。我想不出任何情况。