"xvalue has identity" 是什么意思?

What does it mean "xvalue has identity"?

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

它被 Stroustrup explained 定义为类似(im 类别):"it is a value, which has identity, but can be moved from".

另一个来源, cppreference 说明:

a glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function;

xvalue 是一个 glvalue,所以这句话对 xvalue 也是正确的。

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

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

xvalue有身份是什么意思?

xvalue 确实有一个身份,但在语言中有一个单独的规则,即一元 &-expression 需要一个左值操作数。来自 [expr.unary.op]:

The result of the unary & operator is a pointer to its operand. The operand shall be an lvalue [...]

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

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