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.2p4decltype(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.2p4decltype(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(在
中)对于未命名的基本类型,