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