当我看到这个问题时,我更加困惑了:Is a class instantiation--class_name() a xvalue or a prvalue?,我试图理解类prvalue和类xvalue是什么意思。有人告诉我他们被称为价值类别。但我觉得最好举个例子,因为我很困惑。
class myclass { public: myclass() {}; };
void myfunc(myclass c1){ }
int main(void)
{
myfunc(myclass());
}那么myclass()是什么?它是prvalue还是xvalue?
我需要一个标准的规则,这样我就不会再问更多的问题了。
发布于 2022-10-01 11:58:37
表达式myclass()是使用函数表示法(perexpr.type.conv/1)进行显式类型转换的:
一个简单的类型说明符或类型名称说明符,后面跟着带括号的可选表达式列表或大括号内的列表(初始化项)构造给定初始化项的指定类型的值。
在这里,简单类型说明符myclass后面跟着带括号的表达式列表(),其中包含一个空的初始化程序列表.此表达式从空初始化程序列表中构造一个类型为myclass的值。
所以您可能会问,构造的值是prvalue还是xvalue或lvalue。因此,这里我们必须立即调用下一段:expr.type. here /2:
如果初始化器是带括号的单个表达式,则类型转换表达式等效于相应的强制转换表达式。否则,如果类型为
cv void,而初始化程序为()或{}(如果有),则表达式是不执行初始化的指定类型的prvalue。否则,表达式是指定类型的prvalue,其结果对象由初始化器.直接初始化。。
我们的初始化程序是空的初始化程序列表,并且类型不是cv void,所以我们以以下句子结尾:
否则,表达式是指定类型的prvalue,其结果对象是通过初始化器直接初始化的。
因此,表达式myclass()是一个prvalue,其结果对象是通过调用默认构造函数从空初始化器列表直接初始化的。
https://stackoverflow.com/questions/73918093
复制相似问题