标准规定,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
?我无法理解这些定义。
答案 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。短整数可以称为short
,short int
,signed short int
,signed short
或其任何排列。
它与typeid
运算符(关键字)和typeid(...)
表达式std::typeinfo
的类型之间的关系也没有什么不同。 typeinfo
也不是关键字,在声明之前名称不存在。
基本上,您将实体(空指针常量类型)与名称(std::nullptr_t
)
如果你问为什么语言设计师没有将nullptr_t
和typeinfo
指定为关键字,我会推测它们不足以冒着与用户定义名称冲突的风险相同的拼写。回想一下,任何和所有范围都会发生这种冲突。