创建xvalue的唯一方法是使用static_cast< T&>转换。是的,按标准还有另外三种情况,但它们都需要另一个xvalue。因此,为了简单起见,我认为这是目前唯一的方法。
我们需要把东西传给static_cast。我们叫它吉兹莫吧。无论gizmo到底是什么(lvalue或rvalue),static_cast的结果都是对完全相同的事物的rvalue引用(我的意思是它不会产生任何临时对象)。结果的值类别将是prvalue或xvalue (用于对象)。让我们考虑第二种情况。
我知道,对于对象,xvalue比prvalue要好得多,因为它具有动态类型;但奇怪的是,我不知道gizmo的任何操作,它的生成prvalue包含对同一事物的引用:它看起来像所有将gizmo转换为prvalue的操作(比如static_cast< T>或传递到具有非引用结果的函数)将创建临时对象(使用调用复制构造函数等等)。
总之,如果我们有对象类型的值,我们可以:
或
也许真正重要的是rvalue引用实际上指的是(相同的东西或副本)而不是xvalue/prvalue类别?如果是这样的话,我们可能会认为static_cast< T&>只是保存对相同事物的引用而不再关心xvalue/prvalue的唯一方法。不是吗?
发布于 2019-08-19 16:51:16
例如,xvalue和prvalue在使用decltype扣减规则时很重要。优先选择说的话:
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类型。
https://stackoverflow.com/questions/28641199
复制相似问题