为什么它使用术语"对象"在这里提到一个prvalue?

时间:2018-03-24 07:14:49

标签: c++ language-lawyer c++17 semantics value-categories

据我所知,在c ++ 17中,prvalue的概念/语义是不再是临时对象,因此在许多情况下,副本省略是强制性的。

然而,今天我来了return expression

的描述
  

如果expression是prvalue,函数返回的对象将由该表达式直接初始化。当类型匹配时,这不涉及复制或移动构造函数

为什么术语对象出现在这里?在值类别中,非参考类型的函数返回属于 prvalue ,因此我认为使用术语对象可能不合适。

根据我的理解, prvalues 现在不再是对象,它们只是值,我是对的吗?

作为补充,here也使用术语"对象"。

2 个答案:

答案 0 :(得分:3)

我同意你说的话。有一个关于cppreference的讨论页面,您可以在其中提出您的疑虑。用短语表达的更好方法可能是

  

如果 expression 是prvalue,表达式的结果对象将由该表达式直接初始化。

正如您所说,prvalues不再返回或传递对象。

答案 1 :(得分:2)

引用文本指出有一个对象的值设置为函数的返回值:当按值返回时,C ++ 17保证省略,对象将类似于由调用者创建的变量,调用者正在放置或推回的向量中的元素,或者在调用者精心策划的一些动态分配的内存中构造的对象。你将此与一个临时的混淆,正如你所说的那样可能没有参与。

系统地完成它,你引用cppreference说的是......

return expression;

...那...

  

如果expression是prvalue,则函数返回的对象将直接由该表达式初始化。当类型匹配时,这不涉及复制或移动构造函数

C ++ 17标准在[basic.lval]中说:

  

prvalue结果是表达式存储到其上下文中的值。 [...] prvalue结果对象是由prvalue初始化的对象;用于计算运算符的操作数值或具有类型 cv prvalue的{​​{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

因此,有一个对象涉及并由被调用函数构造,但它的行踪被省略 - 即调用者指定的存储器地址。如果调用者未使用函数调用结果,则至少在概念上构造一个临时构造然后被破坏。