【问题标题】:Is temp object for assignment prvalue in C++ 17?是 C++ 17 中分配纯右值的临时对象吗?
【发布时间】:2020-09-03 18:12:08
【问题描述】:

根据cppreference,在 C++17 中,prvalue 定义为:

  • 计算运算符的操作数的值或者是一个空值 表达式(这样的纯右值没有结果对象),或
  • 初始化一个对象或一个位域(这样的prvalue被称为有一个结果对象)。 除 decltype 外,所有类和数组纯右值都有 结果对象,即使它被丢弃。结果对象可能是 变量,由 new-expression 创建的对象,由 临时实现或其成员;

虽然很明显,初始化的右侧表达式 (1) 像

auto x = 1;

是一个有效的prvalue,因为表达式1初始化了一个对象/位域,我想知道不应该在赋值时使用临时值,例如

x = 1

也被视为prvalue?如果是这样,为什么?平凡的表达式1 不是由运算符求值产生的,也不是初始化对象(因为它是一个赋值)。

【问题讨论】:

  • @Nicol 我找到你了 :-)
  • "平凡的表达式 1 不是算子评估的结果" 它没有说“算子评估的结果” 它说“计算 运算符的操作数的值”。 x = 1 有两个操作数,都需要计算值。
  • 措辞有些误导​​。表达式的使用方式不会影响其值值类别。即使你只写1;1 也是一个prvalue。事实证明,它确实“初始化了一个对象”(从某种意义上说,这里发生了临时物化,因为1discarded-value expression)。

标签: c++ c++17


【解决方案1】:

这些术语的实际定义不是非常清楚或特别精确,但重要的是每个表达式都有一个值类别,并且特定表达式的值类别不依赖于任何更广泛的上下文。

1 始终是纯右值 - 无论 1 最终如何使用。我们的分类法是 glvalue 是“一个表达式,其评估确定对象、位域或函数的身份”([basic.lval]/1.1)和一个 prvalue是...不是那个。 1 不能确定任何东西的身份,它是一个prvalue。

Prvalues 通常用于初始化某些东西(因为否则它们只会被破坏并且不做任何事情 - 1 + 1; 不是一个特别有用的语句,而 x = 1 + 1; 是),这就是它的措辞方式是。但是在这里,1s 和 1 + 1 都是纯右值——即使这是赋值而不是初始化。

【讨论】:

    猜你喜欢
    • 2019-02-28
    • 2011-01-09
    • 2011-02-14
    • 1970-01-01
    • 2011-06-09
    • 2014-08-17
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多