C++11 在C+;中,对于左值而言,它们具有身份但不可移动意味着什么+;11? 我现在正在学习C++ 11,并被C++ 11中的表达式的值范畴弄糊涂了。根据左值是W的左上角,也就是iM(有时是i-m),意思是“有身份,但不能从中移动”。这真让我困惑。请考虑下面的例子: #include <iostream> int main() { int a = 0, b = 1, c = 2; a = std::move(b = c); std::cout << a << '\n'; } #包括 int main() { INTA=0,b=1,c=2; a=std::move(b=c); 标准::cout
粗略地说:C++11 在C+;中,对于左值而言,它们具有身份但不可移动意味着什么+;11? 我现在正在学习C++ 11,并被C++ 11中的表达式的值范畴弄糊涂了。根据左值是W的左上角,也就是iM(有时是i-m),意思是“有身份,但不能从中移动”。这真让我困惑。请考虑下面的例子: #include <iostream> int main() { int a = 0, b = 1, c = 2; a = std::move(b = c); std::cout << a << '\n'; } #包括 int main() { INTA=0,b=1,c=2; a=std::move(b=c); 标准::cout,c++11,value-categories,C++11,Value Categories,粗略地说: 左值具有标识,因为您可以获取其地址 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)
- 左值具有标识,因为您可以获取其地址
int x; &x; // ok
- 无法从中移动左值,因为它不能用作移动构造函数/赋值的参数
在上面的示例中,struct Foo { Foo(Foo&); // 0 Foo(Foo&&); // 1 }; Foo x; Foo y{x}; // calls 0, not 1
是一个左值:调用复制构造函数。如果要从x
移动,则需要将其设置为右值:这就是为什么必须使用x
to将其转换为右值引用的原因std::move(x)
Foo y{std::move(x)}; // calls 1
在您的示例中,
std::move(b=c)
是一个右值,因为std::move
实际上只是一个对右值引用的静态转换。粗略地说:
- 左值具有标识,因为您可以获取其地址
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)
to将其转换为右值引用的原因
Foo y{std::move(x)}; // calls 1
在您的示例中,std::move(b=c)
是一个右值,因为std::move
实际上只是一个对右值引用的static\u cast
。您能否提供一个示例,说明由于“无法从”而导致的编译错误?您能否提供一个示例,说明由于“无法从中移动”?