繁体   English   中英

nullptr的类型是什么?

[英]What is the type of 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的定义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可以被称为shortshort intsigned short intsigned short或其任何排列。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM