代码之家  ›  专栏  ›  技术社区  ›  choxsword

为什么在这里提到prvalue时使用术语“object”?

  •  3
  • choxsword  · 技术社区  · 6 年前

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

    然而,今天我遇到了一个描述 return expression

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

    为什么这个词 对象 在此处发生?在里面 价值类别 非引用类型的函数的返回属于 prvalue公司 ,所以我认为使用这个词可能不合适 对象

    据我了解 prvalues值 不再是 对象 现在,它们只是价值观,对吗?

    作为补充, here 也可使用“对象”一词。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Johannes Schaub - litb    6 年前

    我同意你所说的。cppreference上有一个讨论页面,您可以在其中提出您的担忧。更好的表达方式可能是

    如果 表示 是prvalue,是 表示 由该表达式直接初始化。

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

        2
  •  3
  •   Tony Delroy    6 年前

    引用的文本指出,有一个对象的值设置为函数的返回值:返回时使用C++17的保证省略 按价值 ,该对象将类似于调用者创建的变量、调用者放置的向量中的元素或push\u备份,或在调用者编排的动态分配内存中构造的对象。你把这和一个临时的混淆了,正如你所说,这可能不涉及。

    系统地研究它,你引用了cppreference的一句话。。。

    return expression;
    

    。。。那个

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

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

    这个 后果 prvalue 表达式存储到其上下文中的值。[…]这个 结果对象 prvalue公司 对象是否由 prvalue公司 ;一 prvalue公司 用于计算运算符或具有类型的操作数的值的 简历 void 没有结果对象。[ 笔记 :除非 prvalue公司 是的操作数 decltype说明符 prvalue公司 类或数组类型的始终有一个结果对象。对于丢弃的 prvalue公司 ,临时对象被物化。。。

    那么,在CPP参考文本中,标准术语是什么?” 结果对象 “被称为 “函数返回的对象” 。这种语言在说结果对象是“返回的”而不是“初始化的”时有点不准确,但总体来说,这不会产生误导,而且由于避免了另一点术语,大多数cppreference读者可能更容易理解。我并不积极参与该网站,但作为一名普通用户,我的印象是cppreference试图准确解释标准的本质,但尽可能简化语言。


    虽然标准没有明确说明底层机制,但优化/ABI的实用性决定了不同的实现,为了了解标准在功能上需要什么,它需要 可以 帮助想象编译器实现如下代码。。。

    My_Object function() { return { a, b, c }; }
    ...
    ... {
        My_Object my_object = function();  // caller
    }
    

    。。。通过秘密地将返回对象地址的内存传递给函数(与 this 指向成员函数的指针)。。。

    void function(My_Object* p_returned_object) {
        new (p_returned_object) My_Object{ a, b, c };
    }
    

    因此,被调用函数涉及并构造了一个对象,但忽略了它的位置,即调用方指定的内存地址。如果调用方未使用函数调用结果,则至少会在概念上构造一个临时函数,然后将其销毁。

    推荐文章