【发布时间】: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。事实证明,它确实“初始化了一个对象”(从某种意义上说,这里发生了临时物化,因为1是discarded-value expression)。