创建 xvalue 的唯一方法是使用 static_cast< T&& > 转换。是的,根据标准,还有其他三种情况,但它们都需要另一个 xvalue。因此,为简单起见,我将假设这是目前唯一的方法。
我们需要传递一些东西给 static_cast。我们称之为«小发明»。无论 gizmo 到底是什么(左值或右值),static_cast 的结果都将是对完全相同事物的右值引用(我的意思是它不会产生任何临时对象)。结果的值类别可以是 prvalue 或 xvalue(对于对象)。让我们考虑第二种情况。
我知道 xvalue 对于对象来说比 prvalue 要好得多,因为它具有动态类型;但奇怪的是,我不知道任何带有 «gizmo» 的动作,其产生包含对同一事物的引用的纯右值:看起来所有将 «gizmo» 转换为纯右值的动作(如 static_cast< T > 或传递给函数非引用结果)将创建临时对象(使用调用复制构造函数等)。
总结一下,如果我们有对象类型的值,我们可以:
- 参考该值产生 xvalue
或者
- 参考临时对象(可能是值的副本)产生纯右值*
也许真正重要的是右值引用实际上指的是(相同的东西或副本)而不是 xvalue/prvalue 类别?如果是这样,我们可能会认为 static_cast< T&& > 只是保存对同一事物的引用并且不再关心 xvalue/prvalue 的唯一方法。是不是?
- 当然,如果 value 已经是 prvalue,我们没有义务做一些事情来获得 prvalue,但在这种情况下,动态类型不会丢失。因此,再次与 xvalue 没有区别。