【问题标题】:Why are true, false and nullptr prvalues?为什么是真、假和空指针纯右值?
【发布时间】:2020-01-04 20:39:30
【问题描述】:

据我所知 nullptr 是某个类的实例,如下所示:

const
class {
public:
    template<class T> // convertible to any type
    operator T*() const // of null non-member
    { return 0; } // pointer...
    template<class C, class T> // or any type of null
    operator T C::*() const // member pointer...
    { return 0; }
private:
    void operator&() const; // whose address can't be taken
} nullptr = {};

我猜

true 
false 

也是一些变量。那么,prvalue-s 是一种违反语言类型系统的肮脏黑客这一事实吗?

如果 nullptr 只是一个关键字,那么如何从中派生出 type 呢?

typedef decltype(nullptr) nullptr_t;

【问题讨论】:

  • 不,nullptr 不是类的实例。 truefalse 都不是。
  • 那是什么?
  • 这三个都是keywords。这意味着编译器将它们专门识别为任何其他文字值。
  • truefalsenullptr 文字与 42'a' 等其他文字并没有真正的不同。如果42 是prvalue,为什么true 不应该是prvalue?
  • 它们是值——boolean 类型或 nullptr_t 类型。

标签: c++ c++11 language-lawyer rvalue


【解决方案1】:

看看标准:

8.1.1 文字 [expr.prim.literal] 文字是主要表达式。它的类型取决于它的形式(5.13)。字符串文字是一个左值; 所有其他文字都是 prvalues

<...>

5.13.6 布尔文字 [lex.bool] boolean-literal: false true

布尔文字是关键字 false 和 true。这样的文字是 prvalues 并具有 bool 类型。

5.13.7 指针字面量 [lex.nullptr] 指针字面量:nullptr

指针字面量是关键字 nullptr。它是类型的prvalue std::nullptr_t。 [注意:std::nullptr_t 是一个独特的类型,它是 既不是指针类型也不是指向成员类型的指针;而是一个prvalue 该类型是一个空指针常量,可以转换为空 指针值或空成员指针值。见 7.11 和 7.12。 - 结尾 注意]

因此,如您所见,nullptrfalse/true 都遵守共同规则。唯一的例外是字符串文字(因为它本质上是一个数组)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2011-05-19
    • 2020-01-06
    • 2014-09-07
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多