为什么使用 std::move 并分配给右值不会窃取内部内容?
why using std::move and assign to rvalue does not steal internal content?
众所周知,如果与非基础类型一起使用,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
。您不能将字符串移动或复制到它。它只是指字符串。无论如何,我不认为你可以将左值移动到右值。我想不出任何情况。
众所周知,如果与非基础类型一起使用,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
。您不能将字符串移动或复制到它。它只是指字符串。无论如何,我不认为你可以将左值移动到右值。我想不出任何情况。