0

我现在正在研究 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';
}

这个例子编译得很好。

我们都知道赋值b = c是一个左值,那么他们所说的“不能被移动”是什么意思呢?请举出能清楚说明这一点的例子!

谢谢!

4

1 回答 1

5

大致说来:

  • 左值具有标识,因为您可以获取其地址

    int x;
    &x; // ok
    
  • 无法移动左值,因为它不能用作移动构造函数/赋值的参数

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

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

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

在您的示例std::move(b = c)中是一个rvaluestd::move实际上只是一个static_castrvalue引用

于 2017-05-31T15:58:07.203 回答