如何解决是在C ++ 17中分配prvalue的临时对象吗?
根据cppreference,在C ++ 17中,一个prvalue定义为:
- 计算运算符的操作数的值或为空 表达式(此类prvalue没有结果对象),或
- 初始化一个对象或一个位字段(据说此prvalue具有结果对象)。 除了decltype以外,所有类和数组prvalue都有一个 结果对象,即使它被丢弃。结果对象可能是 变量,由new-expression创建的对象,由new创建的临时对象 临时物化或其成员;
很明显,初始化的右侧表达式(1
)就像
auto x = 1;
是有效的prvalue,因为表达式1
初始化了一个对象/位域,我想知道赋值时不应该使用临时值,例如
x = 1
也可以当作prvalue吗?如果是这样,为什么?平凡的表达式1
并非来自运算符的求值,也不初始化对象(因为它是赋值)。
解决方法
这些术语的实际定义不是很清晰或特别精确,但是重要的部分是每个表达式都有一个值类别,并且特定表达式的值类别不依赖于任何更广泛的上下文。
1
始终是prvalue-不管最终如何使用1
。我们所拥有的分类法是 glvalue 是“其求值确定对象,位域或函数的身份的表达式”([basic.lval]/1.1)和 prvalue 是... 不是。 1
不能确定任何事物的身份,它是prvalue。
Prvalues通常用于初始化某些内容(否则它们将被破坏并且不执行任何操作-1 + 1;
不是特别有用的语句,而x = 1 + 1;
是),这就是为什么措词就是这样。但是在这里,1
和1 + 1
都是prvalue,即使这是赋值而不是初始化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。