9

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

Stroustrup 将其解释为类似于 ( imcategory):“它是一个值,具有标识,但可以从中移出”。

另一个来源, cppreference解释说:

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

And xvalueis a glvalue,所以这 is 陈述也适用于xvalue

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

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

xvalue有身份是什么意思?

4

1 回答 1

5

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

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

通过将 xvalue 绑定到引用,您可以在执行 rvalue-to-lvalue 转换后查看 xvalue 的标识:

int &&r = std::move(a);
int *p = &r;  // OK
于 2018-06-10T12:18:32.100 回答