【问题标题】:How is nullptr rvaluenullptr 右值如何
【发布时间】:2016-07-10 22:45:49
【问题描述】:

在查看nullptrhere 的实现时,我注意到nullptrrvalue,这意味着我们可以做这样的事情

std::nullptr_t&& nullref = nullptr;

但是nullptr 怎么可能是rvalue,因为实现是这样的

const class {...} nullptr = {};

这是核心功能吗?我错过了什么?

【问题讨论】:

  • 每个关键字都是“核心功能”。
  • 就像this

标签: c++ language-lawyer rvalue nullptr


【解决方案1】:

实施与它无关。

关键字nullptr被定义为产生一个右值表达式,到此结束。

[C++14: 2.14.7/1]:指针文字是关键字nullptr。它是std::nullptr_t 类型的纯右值。 [ 注意: std::nullptr_t 是一个独特的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的纯右值是一个空指针常量,可以转换为空指针值或空成员指针值。见 4.10 和 4.11。 ——尾注]

我同意您自己无法在用户空间中根据此标准重新实现它,但是对于每个其他关键字也是如此。

如果您好奇的话,仅由关键字 truefalse 组成的表达式也是右值。

[C++14: 2.14.6/1]: 布尔文字是关键字falsetrue。这样的文字是纯右值,类型为bool

【讨论】:

    【解决方案2】:

    如果备选方案#1 是nullptr 的定义,那么它是一个左值是对的。但是,它可能会被强制为右值,使用如下:

    const class __nullptr_t {...} __nullptr = {};
    #define nullptr (__nullptr_t(__nullptr));
    

    但这并不是最终标准化的内容。在实际的 C++11 中,nullptr 是一个字面量,与 3.14'x' 相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2015-08-27
      • 2022-12-09
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多