在 C++ 11 中,对于左值具有标识但不可移动是什么意思?

What do they mean by having identity but not movable for Lvalue in C++ 11?

我现在正在学习 C++ 11,对 C++ 11 中表达式的值类别感到困惑。根据 terminology,左值是 W 的左上点,即 iM(有时是 i-m)意思是"has identity but cannot be moved from"。这真的让我很困惑。请考虑以下示例:

#include <iostream>

int main()
{
    int a = 0, b = 1, c = 2;
    a = std::move(b = c);
    std::cout << a << '\n';
}

这个例子编译的很好。

我们都知道赋值b = c是一个左值,那么'cannot be moved from'是什么意思呢?请举例说明清楚!

谢谢!

粗略地说:

  • 一个左值有身份,因为你可以取它的地址

    int x;
    &x; // ok
    
  • 一个 lvalue 无法移动,因为它不能用作移动 constructor/assignment

    的参数
    struct Foo 
    {
        Foo(Foo&);  // 0
        Foo(Foo&&); // 1
    };
    
    Foo x;
    Foo y{x}; // calls 0, not 1
    

    在上面的例子中,x是一个左值:复制构造函数被调用。如果你想从 x 移动,你需要使它成为一个 rvalue:这就是为什么你必须使用 std::move(x)cast 到右值引用.

    Foo y{std::move(x)}; // calls 1
    

在你的例子中 std::move(b = c) 是一个 rvalue,因为 std::move 实际上只是 static_castrvalue参考.