nullptr的类型是什么?

时间:2013-06-12 15:23:23

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

标准规定,nullptrstd::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?我无法理解这些定义。

2 个答案:

答案 0 :(得分:6)

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

  

[...] 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)。

答案 1 :(得分:3)

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

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

名称 std::nullptr_t不是关键字(甚至不是上下文敏感的关键字),因此在声明之前名称不存在。如果您在未声明的情况下引用名称std::nullptr_t,则对于任何未声明的名称都是错误的。

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

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

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

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

混为一谈

如果你问为什么语言设计师没有将nullptr_ttypeinfo指定为关键字,我会推测它们不足以冒着与用户定义名称冲突的风险相同的拼写。回想一下,任何和所有范围都会发生这种冲突。