首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类类型的prvalue vs xvalue

类类型的prvalue vs xvalue
EN

Stack Overflow用户
提问于 2022-10-01 11:54:39
回答 1查看 54关注 0票数 0

当我看到这个问题时,我更加困惑了:Is a class instantiation--class_name() a xvalue or a prvalue?,我试图理解类prvalue和类xvalue是什么意思。有人告诉我他们被称为价值类别。但我觉得最好举个例子,因为我很困惑。

代码语言:javascript
复制
class myclass { public: myclass() {}; };

void myfunc(myclass c1){  }

int main(void)
{
   myfunc(myclass());
}

那么myclass()是什么?它是prvalue还是xvalue?

我需要一个标准的规则,这样我就不会再问更多的问题了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,其结果对象是通过调用默认构造函数从空初始化器列表直接初始化的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73918093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档