Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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
    移动,则需要将其设置为右值:这就是为什么必须使用
    std::move(x)
    to将其转换为右值引用的原因

    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

您能否提供一个示例,说明由于“无法从”而导致的编译错误?您能否提供一个示例,说明由于“无法从中移动”?