C++11 xvalue/prvalue类别真的重要吗?

C++11 xvalue/prvalue类别真的重要吗?,c++11,xvalue,C++11,Xvalue,创建xvalue的唯一方法是使用静态转换。 是的,还有其他三种情况,但所有这些情况都需要另一个xvalue。所以,为了简单起见,我假设这是目前唯一的方法 我们需要把东西传给演员。让我们称之为“gizmo”。 无论gizmo的左值或右值是什么,静态_cast的结果都是对完全相同的对象的右值引用,我的意思是它不会生成任何临时对象。对于对象,结果的值类别将是prvalue或xvalue。让我们考虑第二种情况。 我知道xvalue比prvalue更适合对象,因为它具有动态类型;但奇怪的是,我不知道任何带

创建xvalue的唯一方法是使用静态转换。 是的,还有其他三种情况,但所有这些情况都需要另一个xvalue。所以,为了简单起见,我假设这是目前唯一的方法

我们需要把东西传给演员。让我们称之为“gizmo”。 无论gizmo的左值或右值是什么,静态_cast的结果都是对完全相同的对象的右值引用,我的意思是它不会生成任何临时对象。对于对象,结果的值类别将是prvalue或xvalue。让我们考虑第二种情况。 我知道xvalue比prvalue更适合对象,因为它具有动态类型;但奇怪的是,我不知道任何带有«gizmo»的操作,其生成的prvalue包含对同一事物的引用:看起来所有将«gizmo»转换为prvalue的操作(如static_cast)或传递给具有非引用结果的函数的操作都会使用调用复制构造函数创建临时对象,等等

总之,如果我们有对象类型的值,我们可以:

参照该值生成xvalue 或

参考临时对象生成prvalue,可能是值的副本* 也许真正重要的是,右值引用实际上指的是同一事物或副本,而不是xvalue/prvalue类别? 如果是这样的话,我们可能会认为static_cast只是保存对同一事物的引用的唯一方法,不再关心xvalue/prvalue。不是吗

当然,如果value已经是prvalue,我们没有义务做一些事情来获得prvalue,但在这种情况下,动态类型不能丢失。所以,与xvalue没有区别。 例如,在使用decltype推断规则时,xvalue和prvalue很重要。怎么说:

a如果表达式的值类别是xvalue,则decltype产生T&; 如果表达式的值类别是左值,那么decltype产生T&; c如果表达式的值类别是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都会得到as类型。

我不知道您的实际问题是什么。您是否正在寻找xvalue和prvalue行为不同的场景?我试图编写一个代码段,其中不同行为的唯一原因是不同的值类别xvalue/prvalue。但当我尝试将某些东西转换为prvalue时,它实际上会生成临时对象。看起来这种副作用是造成不同行为的主要原因。我尝试过:这个问题可能重复了我读了至少六遍,但我仍然不知道到底问了什么问题。