【问题标题】:What does it mean "xvalue has identity"?“xvalue 有身份”是什么意思?
【发布时间】:2018-06-10 12:09:12
【问题描述】:

C++11 引入了新的值类别,其中之一是xvalue

Stroustrup 的 explained 类似于(im 类别):“它是一个值,具有标识,但可以从中移出”。

另一个来源, cppreference 解释:

glvalue 是一个表达式,其求值决定了对象、位域或函数的身份;

xvalueglvalue,所以xvalue 也是如此。

现在,我想如果xvalue 有身份,那么我可以检查两个xvalues 是否引用同一个对象,所以我取xvalue 的地址。事实证明,这是不允许的:

int main() {
    int a;
    int *b = &std::move(a); // NOT ALLOWED
}

xvalue有身份是什么意思?

【问题讨论】:

    标签: c++ c++11 move-semantics xvalue


    【解决方案1】:

    xvalue 确实有一个标识,但语言中有一条单独的规则,即一元 &-表达式需要一个左值操作数。来自 [expr.unary.op]:

    一元& 运算符的结果是指向其操作数的指针。操作数应为左值 [...]

    在执行右值到左值转换后,您可以通过将 xvalue 绑定到引用来查看 xvalue 的标识:

    int &&r = std::move(a);
    int *p = &r;  // OK
    

    【讨论】:

    • 是的,但是如果您将其分配给const &,您可以对prvalue 执行“相同”操作。而且prvalue没有身份。
    • @geza:在 C++17 中,您会说纯右值在绑定到引用时被物化(= 转换为泛左值)。在 C++17 之前,绑定到引用 s 只是一个通用的右值到左值的转换,如果给出了右值,它确实会创建一个左值。但是在 OP 的示例中没有纯右值,所以我们正在谈论的身份总是明确相同的。 (“没有实现”,用 C++17 术语。)
    • 另外要考虑的是std::move将任意值转换为glvalue,但是如果原始值已经是glvalue,那么它的glvalueness不变(只有“l”改为“x” )。
    • 所以基本上你说,因为xvalue有身份,它不需要物化(因为它已经物化了),而prvalue在某些情况下需要它?这就是“有身份”和“没有身份”变量之间的主要区别?
    • @geza:有点——但不是“变量”,而是“价值”。变量永远不能是纯右值。一个变量要么是一个对象,要么是一个引用,一旦一个值绑定到一个引用,它就必须成为一个泛左值。
    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多