据我所知,在c ++ 17中,prvalue的概念/语义是不再是临时对象,因此在许多情况下,副本省略是强制性的。
然而,今天我来了return expression
的描述如果expression是prvalue,函数返回的对象将由该表达式直接初始化。当类型匹配时,这不涉及复制或移动构造函数
为什么术语对象出现在这里?在值类别中,非参考类型的函数返回属于 prvalue ,因此我认为使用术语对象可能不合适。
根据我的理解, prvalues 现在不再是对象,它们只是值,我是对的吗?
作为补充,here也使用术语"对象"。
答案 0 :(得分:3)
我同意你说的话。有一个关于cppreference的讨论页面,您可以在其中提出您的疑虑。用短语表达的更好方法可能是
如果 expression 是prvalue,表达式的结果对象将由该表达式直接初始化。
正如您所说,prvalues不再返回或传递对象。
答案 1 :(得分:2)
引用文本指出有一个对象的值设置为函数的返回值:当按值返回时,C ++ 17保证省略,对象将类似于由调用者创建的变量,调用者正在放置或推回的向量中的元素,或者在调用者精心策划的一些动态分配的内存中构造的对象。你将此与一个临时的混淆,正如你所说的那样可能没有参与。
系统地完成它,你引用cppreference说的是......
return expression;
...那...
如果expression是prvalue,则函数返回的对象将直接由该表达式初始化。当类型匹配时,这不涉及复制或移动构造函数
C ++ 17标准在[basic.lval]中说:
prvalue
的结果是表达式存储到其上下文中的值。 [...]prvalue
的结果对象是由prvalue
初始化的对象;用于计算运算符的操作数值或具有类型 cvprvalue
的{{1}}没有结果对象。 [注意:除void
是 decltype-specifier 的操作数外,prvalue
类或数组类型始终具有结果对象。对于丢弃的prvalue
,实现临时对象; ...
因此,在cppreference文本中," 结果对象"的标准术语是什么?被称为"函数" 返回的对象。说结果对象是"返回"语言有点不精确。而不是"初始化",但总体而言,它没有误导性 - 并且 - 因为避免了另一些术语 - 对于大多数cppreference读者来说可能更容易理解。我没有积极参与该网站,但作为普通用户,我的印象是,cppreference正试图准确地解释标准的本质,但在可能的情况下简化语言。
虽然标准没有指定底层机制 - 优化/ ABI的实用性决定了不同的实现 - 为了理解标准需要在功能上发生什么,它可能有助于想象编译器实现像......这样的代码。
prvalue
...通过秘密地将一个返回内存的对象地址传递给该函数(非常类似于成员函数的My_Object function() { return { a, b, c }; }
...
... {
My_Object my_object = function(); // caller
}
指针)...
this
因此,有一个对象涉及并由被调用函数构造,但它的行踪被省略 - 即调用者指定的存储器地址。如果调用者未使用函数调用结果,则至少在概念上构造一个临时构造然后被破坏。