【发布时间】:2014-09-04 20:54:29
【问题描述】:
C++11 和 C++14 标准(和工作草案,分别)在 §3.10.1 中说:
prvalue(“纯”右值)是一个不是 xvalue 的右值。 【示例:调用函数的结果 返回类型不是引用的就是prvalue。诸如 12、7.3e5 或 true 等文字的值是 也是prvalue。 ——结束示例]
和
一个右值(历史上所谓的,因为右值可能出现在赋值的右侧 expression) 是一个 xvalue、一个临时对象 (12.2) 或其子对象,或者 一个不相关的值 用一个对象。
这让我想到了一个问题:表达式如何成为“不与对象关联的值”?
我的印象是,表达式的目的是返回对象或void(我也不希望它是一个值)。
这样的表达有一些简单而常见的例子吗?
编辑 1
要使事情变得更复杂,请考虑以下几点:
int const& x = 3;
int&& y = 4;
在 §8.3.2.5 的上下文中,其中包含最有趣的 sn-p:
[...] 一个引用应该被初始化为引用一个有效的对象或 功能 [...]
第 8.5.3.1 节加强了这一点:
声明为 T& 或 T&& 的变量,即“对类型 T 的引用”(8.3.2),应由对象初始化, 或函数,T 类型或可以转换为 T 的对象。[...]
【问题讨论】:
-
42; ;;;;;;;;;;;;;;;;;
-
非左值表达式产生值,而不是对象。
-
@KeithThompson 那么,产生临时对象的纯右值表达式不会产生对象吗? 困惑
-
我不完全确定;我比 C++ 更了解 C,而 C 只有左值和非左值。在任何情况下,表达式
42的值都是与对象无关的纯右值;评估42不会创建int对象。 -
我立即认为
nullptr、true、this等可能是没有对象的值,但我不确定。
标签: c++ c++11 language-lawyer c++14