[英]What is the type of nullptr?
标准规定, 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
的定义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
)的别名。
在内部有一个实体,它是空指针常量类型 。 它是基本类型之一。
关键字,literal和expression nullptr
具有此类型。 decltype(nullptr)
指的是这种类型。
但是, 名称 std::nullptr_t
不是关键字(甚至不是上下文敏感的关键字),因此在声明之前名称不存在。 如果在没有声明的情况下引用名称std::nullptr_t
,那么对于任何未声明的名称都是错误的。
因此,虽然类型存在于任何基本类型的转换开始处,但该名称不存在。
事实上,还有其他基本类型没有“单一拼写”,例如short int。 short int可以被称为short
, short int
, signed short int
, signed short
或其任何排列。
它与typeid
运算符(关键字)和typeid(...)
表达式的类型std::typeinfo
之间的关系也没有什么不同。 typeinfo
也不是关键字,并且在声明之前名称不存在。
基本上,您将实体 (空指针常量类型)与名称 ( std::nullptr_t
) std::nullptr_t
如果你问为什么语言设计者没有指定nullptr_t
和typeinfo
作为关键字,我会推测它们不常见,冒着与具有相同拼写的用户定义名称发生名称冲突的风险。 回想一下,任何和所有范围都会发生这种冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.