gez*_*eza 7 c++ move-semantics xvalue c++11
C++ 11引入了新的值类别,其中之一就是xvalue.
它被Stroustrup 解释为(im类别):"它是一个值,它具有身份,但可以从"移动".
另一个来源, cppreference解释说:
glvalue是一个表达式,其评估决定了对象,位域或函数的身份;
并且xvalue是一个glvalue,所以这个陈述也是如此xvalue.
现在,我认为如果有一个xvalue身份,那么我可以检查两个xvalues是否引用同一个对象,所以我取一个地址xvalue.事实证明,不允许:
int main() {
int a;
int *b = &std::move(a); // NOT ALLOWED
}
Run Code Online (Sandbox Code Playgroud)
xvalue具有身份意味着什么?
xvalue确实有一个标识,但是在语言中有一个单独的规则,一元&表达式需要一个左值操作数.来自[expr.unary.op]:
一元运算
&符的结果是指向其操作数的指针.操作数应为左值[...]
通过将xvalue绑定到引用,可以在执行rvalue-to -valval转换后查看xvalue的标识:
int &&r = std::move(a);
int *p = &r; // OK
Run Code Online (Sandbox Code Playgroud)