"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
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