nullptr的类型是什么?

MWi*_*Wid 9 c++ types nullptr c++11

标准状态,即nullptr类型std::nullptr_t(2.14.7)的指针文字.并且18.2p9定义nullptr_t

namespace std {
  typedef decltype(nullptr) nullptr_t;
}
Run Code Online (Sandbox Code Playgroud)

7.1.6.2p4 decltype(nullptr)是表达式的类型,nullptr根据定义std::nullptr_t(因为表达式nullptr是prvalue).将其代入nullptr_t结果的定义中

typedef nullptr_t nullptr_t
Run Code Online (Sandbox Code Playgroud)

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

And*_*owl 8

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

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

只要它的行为与标准在这两段中指定的一样,它就可以是任何东西.

我相信你的论证中的逻辑谬误是:

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

难道意味着nullptr_t不是一个类型别名.例如,如果我定义:

typedef decltype(42) foo;
Run Code Online (Sandbox Code Playgroud)

我可以说表达式的类型:

42
Run Code Online (Sandbox Code Playgroud)

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

  • @MWid:不,它是标准未指定的内容的同义词.`nullptr`的类型是`std :: nullptr_t`这一事实并不意味着`std :: nullptr_t`不能成为其他类型的别名.这就是我在答案中尝试传达的内容(特别是在最后一个例子中),尽管我感觉我还没有很好地表达出来 (4认同)
  • @MWid:是的,`std :: nullptr_t`是一种基本类型.它也是标量类型和对象类型. (3认同)
  • 简而言之:类型不是他们的名字. (3认同)
  • @MWid:也许原因之一是引入新关键字对于使用名称“nullptr_t”的旧程序来说是一个问题(也许没有任何关键字,但很难说)。将“nullptr_t”设为关键字可能会使这些程序格式错误。这样,您就可以将`nullptr_t`名称用于您自己的目的,如果您需要通过名称引用`nullptr`的类型,那么您可以使用`std::nullptr_t` (2认同)
  • 我认为更准确的说法是 `std::nullptr_t` 是一个 typedef(在 `<cstddef>` 中),用于其他未命名的基本类型,其中 `nullptr` 是一个实例。 (2认同)

And*_*zos 6

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

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

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

因此,尽管该类型像任何基本类型一样在翻译开始时就存在,但该名称并不存在。

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

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

基本上,您将实体(空指针常量类型)与名称( std::nullptr_t)混为一谈

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

  • @MWid:这不是明确的,我使用术语“解释”来指代“nullptr”的类型,与该类型的 C++ _name_ 不同。我同意该标准可以更清楚地区分,我描述的大部分内容都是隐含的结果 - 但实体和名称在第 3 条的前言中是区分的。 (2认同)