【问题标题】:How is nullptr rvaluenullptr 右值如何
【发布时间】:2016-07-10 22:45:49
【问题描述】:
在查看nullptrhere 的实现时,我注意到nullptr 是rvalue,这意味着我们可以做这样的事情
std::nullptr_t&& nullref = nullptr;
但是nullptr 怎么可能是rvalue,因为实现是这样的
const class {...} nullptr = {};
这是核心功能吗?我错过了什么?
【问题讨论】:
标签:
c++
language-lawyer
rvalue
nullptr
【解决方案1】:
实施与它无关。
关键字nullptr被定义为产生一个右值表达式,到此结束。
[C++14: 2.14.7/1]:指针文字是关键字nullptr。它是std::nullptr_t 类型的纯右值。 [ 注意: std::nullptr_t 是一个独特的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的纯右值是一个空指针常量,可以转换为空指针值或空成员指针值。见 4.10 和 4.11。 ——尾注]
我同意您自己无法在用户空间中根据此标准重新实现它,但是对于每个其他关键字也是如此。
如果您好奇的话,仅由关键字 true 和 false 组成的表达式也是右值。
[C++14: 2.14.6/1]: 布尔文字是关键字false 和true。这样的文字是纯右值,类型为bool。
【解决方案2】:
如果备选方案#1 是nullptr 的定义,那么它是一个左值是对的。但是,它可能会被强制为右值,使用如下:
const class __nullptr_t {...} __nullptr = {};
#define nullptr (__nullptr_t(__nullptr));
但这并不是最终标准化的内容。在实际的 C++11 中,nullptr 是一个字面量,与 3.14 或 'x' 相同。