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

duo*_*gja 0 c++11 value-categories

我现在正在学习 C++ 11 并且对 C++ 11 中表达式的值类别感到困惑。根据术语,左值是 W 的左上角,即 iM(或有时是 im),意思是“具有身份但不能移动从”。这真的让我很困惑。请考虑以下示例:

#include <iostream>

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

这个例子编译得很好。

我们都知道赋值b = c是一个左值,那么“不能移动”是什么意思?请举例说明这一点!

谢谢!

Vit*_*meo 5

大致说来:

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

    int x;
    &x; // ok
    
    Run Code Online (Sandbox Code Playgroud)
  • 一个左值不能从,因为它不能被用来作为一个参数来移动的构造/分配移动

    struct Foo 
    {
        Foo(Foo&);  // 0
        Foo(Foo&&); // 1
    };
    
    Foo x;
    Foo y{x}; // calls 0, not 1
    
    Run Code Online (Sandbox Code Playgroud)

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

    Foo y{std::move(x)}; // calls 1
    
    Run Code Online (Sandbox Code Playgroud)

在您的例子std::move(b = c)是一个右值,因为std::move是从字面上只是static_cast一个右值引用