空点的类型是什么

What is the type of nullptr?

本文关键字:是什么 类型      更新时间:2023-10-16

标准声明,nullptr是类型为 std::nullptr_t (2.14.7( 的指针文本。18.2p9 定义nullptr_t

namespace std {
  typedef decltype(nullptr) nullptr_t;
}

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

会导致
typedef nullptr_t nullptr_t

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

它是特定于实现的。重要的是(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;

我可以说表达式的类型:

42

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

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

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

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

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

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

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

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

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