C++ 空PTR的类型是什么?

C++ 空PTR的类型是什么?,c++,c++11,types,nullptr,C++,C++11,Types,Nullptr,该标准规定,nullptr是类型为std::nullptr\u t(2.14.7)的指针文本。18.2p9定义了nullptr\t namespace std { typedef decltype(nullptr) nullptr_t; } By 7.1.6.2p4decltype(nullptr)是表达式nullptr的类型,根据定义它是std::nullptr\t(因为表达式nullptr是一个PR值)。将其替换为nullptr\t的定义会导致 typedef nullptr_t nu

该标准规定,
nullptr
是类型为
std::nullptr\u t
(2.14.7)的指针文本。18.2p9定义了
nullptr\t

namespace std {
  typedef decltype(nullptr) nullptr_t;
}
By 7.1.6.2p4
decltype(nullptr)
是表达式
nullptr
的类型,根据定义它是
std::nullptr\t
(因为表达式
nullptr
是一个PR值)。将其替换为
nullptr\t
的定义会导致

typedef nullptr_t nullptr_t

另一方面,typedef说明符并不引入新类型,它只是另一个现有类型的名称。那么,到底什么是
nullptr\t
?我无法理解这些定义。

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

[…]作为同义词的
nullptr\u t
类型具有3.9.1和4.10中描述的特征。[……]

只要它的行为符合这两段中规定的标准,它就可以是任何东西

我相信你论点中的逻辑谬误是:

By 7.1.6.2p4
decltype(nullptr)
是表达式
nullptr
的类型,根据定义
std::nullptr\t
(因为表达式
nullptr
是一个PR值)

not是否意味着
nullptr\t
不是类型别名。例如,如果我定义:

typedef decltype(42) foo;
我可以说表达式的类型:

42

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

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

关键字、文本和表达式
nullptr
具有此类型
decltype(nullptr)
引用此类型

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

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

事实上,还有其他一些基本类型没有“单一拼写”,例如short int。short int可以称为
short
short int
有符号short int
有符号short
,或其任何排列

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

基本上,您正在将实体(空指针常量类型)与名称(
std::nullptr\t
)合并


如果你问,为什么语言设计者没有指定
nullptr\t
typeinfo
作为关键字,我会推测它们不够常见,不会与拼写相同的用户定义名称发生名称冲突。回想一下,这样的冲突会发生在任何范围内。

@MWid:不,它是标准中未规定的事物的同义词。
nullptr
的类型是
std::nullptr\u t
这一事实并不意味着
std::nullptr\u t
不能是其他类型的别名。这就是我在回答中试图表达的内容(特别是在最后一个例子中),尽管我觉得我没有很好地表达出来,但是你的回答让我相信
nullptr\t
是另一种类型的同义词。你说,这个类型不是标准规定的。总之,这意味着
nullptr\u t
是未指定基本类型的同义词?@MWid:Yes,
std::nullptr\u t
是基本类型。它也是标量类型和对象类型。我认为更准确的说法是,
std::nullptr\u t
是一个typedef(在
中)对于未命名的基本类型, NulLPTR> /Cult>是一个实例。简单地说:类型不是它们的名字。在NULL?@ MWID中定义的NULL指针常量类型:它不是明了的,我用Exchange术语来引用<代码> NulLPTR < /代码>的类型,这与该类型的C++名称不同。我同意该标准可以更清楚地区分,我所描述的大部分是一个隐含的结果——但实体和名称在第3条的序言中有所区分。