标准规定,nullptr是std::nullptr_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是prvalue)。将其替换到nullptr_t的定义中会导致以下结果
typedef nullptr_t nullptr_t另一方面,type说明符并不引入新类型,它只是另一个现有类型的名称。那么,nullptr_t到底是什么呢?我不能理解这些定义。
发布于 2013-06-13 00:06:11
在内部存在一个空指针常量类型的实体。它是最基本的类型之一。
关键字、文字和表达式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作为关键字,我会猜测它们还不够常见,不会有与具有相同拼写的用户定义名称发生名称冲突的风险。回想一下,在任何范围内都会发生这样的冲突。
发布于 2013-06-12 23:30:14
它是特定于实现的。重要的是( C++11标准的18.2/9页):
...
nullptr_t是其同义词的类型具有3.9.1和4.10中描述的特征。..。
只要它的行为像标准在这两个段落中指定的那样,它可以是任何东西。
我相信你论证中的逻辑谬误是这样的:
By 7.1.6.2p4
decltype(nullptr)是表达式nullptr的类型,根据定义它是std::nullptr_t(因为表达式nullptr是prvalue)
not 是否意味着nullptr_t不是类型别名。例如,如果我定义:
typedef decltype(42) foo;我可以说表达式的类型:
42是foo。然而,foo仅仅是另一种类型(int)的别名。
https://stackoverflow.com/questions/17069315
复制相似问题