【问题标题】:What is the type of nullptr?nullptr 的类型是什么?
【发布时间】:2013-06-08 18:58:34
【问题描述】:

标准规定,nullptrstd::nullptr_t (2.14.7) 类型的指针文字。而 18.2p9 定义了nullptr_t by

namespace std {
  typedef decltype(nullptr) nullptr_t;
}

By 7.1.6.2p4 decltype(nullptr) 是表达式nullptr 的类型,根据定义std::nullptr_t(因为表达式nullptr 是prvalue)。将其代入nullptr_t 的定义中会得到

typedef nullptr_t nullptr_t

另一方面,typedef 说明符不会引入新类型,它只是另一个现有类型的名称。那么,nullptr_t 到底是什么?我无法理解这些定义。

【问题讨论】:

    标签: c++ c++11 types nullptr


    【解决方案1】:

    它是特定于实现的。重要的是(C++11 标准的第 18.2/9 页):

    [...] nullptr_t 是同义词的类型具有 3.9.1 和 4.10 中描述的特征。 [...]

    只要它的行为符合标准在这两段中的规定,它可以是任何东西。

    我认为你的论点中的逻辑谬误在于:

    By 7.1.6.2p4 decltype(nullptr) 是表达式nullptr 的类型,根据定义是std::nullptr_t(因为表达式nullptr 是prvalue)

    not 是否意味着nullptr_t 不是 类型别名。例如,如果我定义:

    typedef decltype(42) foo;
    

    我可以说表达式的类型:

    42
    

    foo。然而,foo 只是另一种类型 (int) 的别名。

    【讨论】:

    • @MWid:不,它是标准未指定内容的同义词。 nullptr 的类型是 std::nullptr_t 的事实并不意味着 std::nullptr_t 不能是其他类型的别名。这就是我在回答中试图传达的内容(尤其是在最后一个示例中),尽管我觉得我没有很好地表达它
    • 嗯,你的回答让我相信nullptr_t 是另一种类型的同义词。你说,标准没有规定这种类型。总之,这意味着nullptr_t 是未指定基本类型的同义词?
    • @MWid:是的,std::nullptr_t 是基本类型。也是标量类型和对象类型。
    • 我认为更准确的说法是 std::nullptr_t 是一个 typedef(在 <cstddef> 中),用于其他未命名的基本类型,其中 nullptr 是一个实例。
    • 简而言之:类型不是它们的名字。
    【解决方案2】:

    内部有一个实体是空指针常量类型。它是基本类型之一。

    关键字、文字和表达式nullptr 具有这种类型。 decltype(nullptr) 指的是这种类型。

    然而 name std::nullptr_t 不是关键字(甚至不是上下文相关的关键字),因此名称在声明之前不存在。如果您引用名称std::nullptr_t 而不声明它,则与任何未声明的名称一样,都是错误的。

    因此,虽然 type 像任何基本类型一样在翻译开始时就存在,但 name 并不存在。

    事实上,还有其他基本类型没有“单一拼写”,例如 short int。短整数可以称为shortshort intsigned short intsigned short 或其任何排列。

    typeid 运算符(关键字)和typeid(...) 表达式的类型std::typeinfo 之间的关系也没有什么不同。 typeinfo 也不是关键字,并且名称在声明之前不存在。

    基本上,您将 entity(空指针常量类型)与 name (std::nullptr_t)

    混为一谈

    如果您问为什么语言设计者没有指定 nullptr_ttypeinfo 作为关键字,我会推测它们不够常见,不会与具有相同拼写的用户定义名称发生名称冲突。回想一下,这种冲突会发生在任何和所有范围内。

    【讨论】:

    • 标准中的空指针常量类型在哪里定义?
    • @MWid:这不是明确的,我使用说明的术语来指代nullptr 的类型,这与 C++ name 不同类型。我同意标准可以更清楚地说明区别,我所描述的大部分内容都是隐含的结果 - 但实体和名称在第 3 条的序言中有所区别。
    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多