在 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_cast
到 rvalue参考.
我现在正在学习 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_cast
到 rvalue参考.