创建xvalue的唯一方法是使用static_cast< T&安培;&安培; >转换。 是的,according to standard还有其他三种情况,但所有情况都需要另一个xvalue。因此,为简单起见,我认为现在只是这样。
我们需要传递一些东西给static_cast。我们称之为“Gizmo”。 无论gizmo究竟是什么(左值或右值),static_cast的结果都是rvalue引用完全相同的东西(我的意思是它不会产生任何临时对象)。结果的值类别可以是prvalue或xvalue(对于对象)。让我们考虑第二种情况。
据我所知,对于对象而言,xvalue远比prvalue好,因为它具有动态类型;但奇怪的是,我不知道«gizmo»的任何动作,其产品prvalue包含对同一事物的引用:它看起来像将所有动作转换为«gizmo»到prvalue(如static_cast< T>或传递给函数)使用非引用结果)将创建临时对象(使用调用复制构造函数等)。
总结一下,如果我们有对象类型的值,我们可以:
或
也许真正重要的是rvalue引用实际上指的是(相同的东西或副本)而不是xvalue / prvalue类别? 如果是这样,我们可能会认为static_cast< T&安培;&安培; >只是为了保存对同一事物的引用而不再关心xvalue / prvalue。不是吗?
答案 0 :(得分:0)
xvalue
推导规则时, prvalue
和decltype
很重要。 cppreference说:
xvalue
,则decltype
会产生T&&
; lvalue
,则decltype
会产生T&
; prvalue
,则decltype
会产生T
。通过这种方式,编译器可以更好地提示即将出现哪种类型的表达式。当然,从语义上讲,这对于处理表达式非常重要。
示例:
struct A {};
int main() {
decltype(auto) a1 = A(); //prvalue, type of a1 is A
decltype(auto) a2 = std::move(A()); //xvalue, type of a2 is A&&
}
在此示例中,使用auto
,a1
和a2
都将获得A
作为类型。