Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++ 说xvalue具有同一性并且是可移动的是正确的吗?_C++_C++11_Rvalue Reference - Fatal编程技术网

C++ 说xvalue具有同一性并且是可移动的是正确的吗?

C++ 说xvalue具有同一性并且是可移动的是正确的吗?,c++,c++11,rvalue-reference,C++,C++11,Rvalue Reference,根据这份文件: l值具有同一性且不可移动 pr值是可移动的,但没有标识 x值具有标识性且可移动 关于这些,我有几个问题 a。x值具有标识的示例是什么?以下内容不合法: Foo f; &std::move(f); b。我可以重载Foo类的&-运算符并使其返回this,以便以下内容合法: &Foo(5); 但是像Foo(5)这样的pr值不能有标识。还是对身份有更微妙的解释 还是对身份有更微妙的解释 链接的文档包含以下两个定义: “has identity”-即和地址,一个指针

根据这份文件:

  • l值具有同一性且不可移动
  • pr值是可移动的,但没有标识
  • x值具有标识性且可移动
  • 关于这些,我有几个问题

    a。x值具有标识的示例是什么?以下内容不合法:

    Foo f;
    &std::move(f);
    
    b。我可以重载Foo类的&-运算符并使其返回this,以便以下内容合法:

    &Foo(5);
    
    但是像Foo(5)这样的pr值不能有标识。还是对身份有更微妙的解释

    还是对身份有更微妙的解释

    链接的文档包含以下两个定义:

    • “has identity”-即和地址,一个指针,用户可以确定是否有两个副本 一模一样的
    • “可从”移动–即,我们被允许以某种不确定的方式保留“副本”的来源, 但有效状态
    看看标准,我们可以得出一个对象的定义(根据§1.8/1)是:

    对象是一个存储区域

    根据第1.7/1条:

    每个字节都有一个唯一的地址

    他有一个地址。这意味着定义非常宽泛,几乎包括任何类型的值(右值、X值、PR值、左值等)的每一个对象


    x值具有标识的示例是什么

    标准本身给出了生成xvalues的表达式列表(见§5/7):

    表达式是一个xvalue,如果它是:

    • 隐式或显式调用返回类型为右值引用的函数的结果 对于对象类型
    • 对对象类型的右值引用的强制转换
    • 类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是xvalue,或
    • 指向成员表达式的.*指针,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针
    通常,此规则的效果是,命名的右值引用被视为左值,而对对象的未命名右值引用被视为x值;无论是否命名,对函数的右值引用都被视为左值

    作为后续,给出了几个例子。以下是对它们的扩展:

    struct A { int m; };
    
    A&& operator+(A, A);
    A a;
    A b;
    a + b;   // xvalue
    
    A&& f();
    f();     // xvalue
    f().m;   // xvalue
    
    A a;
    static_cast<A&&>(a);  // xvalue
    std::move(a);         // xvalue
    
    结构A{int m;}; A&&运算符+(A,A); A A; A b; a+b;//xvalue A&&f(); f();//xvalue f().m;//xvalue A A; 静态(a);//xvalue 标准::移动(a);//xvalue
    < Stroutrup > C++编程语言的这条线可以清楚地解释这个问题:

    。。。std::move(vs)是一个xvalue:它显然具有标识(我们可以将其称为vs),但我们已通过调用std::move()(§3.3.2,§35.5.1)明确授予将其从中移动的权限


    xvalue通常是强制转换到右值引用或访问xvalue类对象成员的结果。例如,
    autox=42;静态强制转换(x)
    静态强制转换
    的结果是一个x值。您是否阅读了标准中值类别的正式规范?我对这个“具有同一性”原则也有点困惑(有些人也将其用作“对象”的定义),但标准似乎没有使用它。x值表达式的同一性是什么?你是怎么得到的?表达式std::move(a)的标识(或地址)是什么?我想是&a。但是我们不能对它应用&-运算符。这与公关价值有何不同?或者是因为名称绑定到基础对象,但x值表达式使其可以从中移动。@ArindamMukherjee:这是一个有趣的问题。我不确定不允许xvalue地址的原因,但我怀疑这只是为了避免错误。xvalues在实践中相当罕见,因此没有太多理由让获取它们的地址变得非常方便。xvalue将转换为常量左值引用,然后您可以获得被引用对象的地址。@ArindamMukherjee:但它仍然会提出一个问题,即“标识”是什么,因为您也可以将常量引用绑定到prvalue。这似乎取决于是否涉及到临时合同。那么,一旦一个引用绑定到一个临时的,并且可以获取它的地址,它是否就变成了非临时的呢?我想这是一种看法。