首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nullptr的类型是什么?

nullptr的类型是什么?
EN

Stack Overflow用户
提问于 2013-06-12 23:23:23
回答 2查看 6.2K关注 0票数 11

标准规定,nullptrstd::nullptr_t (2.14.7)类型的指针文字。和18.2p9通过以下方式定义nullptr_t

代码语言:javascript
复制
namespace std {
  typedef decltype(nullptr) nullptr_t;
}

By 7.1.6.2p4 decltype(nullptr)是表达式nullptr的类型,根据定义它是std::nullptr_t (因为表达式nullptr是prvalue)。将其替换到nullptr_t的定义中会导致以下结果

代码语言:javascript
复制
typedef nullptr_t nullptr_t

另一方面,type说明符并不引入新类型,它只是另一个现有类型的名称。那么,nullptr_t到底是什么呢?我不能理解这些定义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-13 00:06:11

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

关键字、文字和表达式nullptr具有此类型。decltype(nullptr)指的是这种类型。

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

因此,尽管类型在转换开始时就像任何基本类型一样存在,但名称并不存在。

事实上,还有其他基本类型没有“单一拼写”,例如short int。短整数可以被称为shortshort intsigned short intsigned short或它们的任何排列。

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

基本上,您是将一个实体(空指针常量类型)与一个名称(std::nullptr_t)合并在一起。

如果您问语言设计者为什么不指定nullptr_ttypeinfo作为关键字,我会猜测它们还不够常见,不会有与具有相同拼写的用户定义名称发生名称冲突的风险。回想一下,在任何范围内都会发生这样的冲突。

票数 4
EN

Stack Overflow用户

发布于 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不是类型别名。例如,如果我定义:

代码语言:javascript
复制
typedef decltype(42) foo;

我可以说表达式的类型:

代码语言:javascript
复制
42

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17069315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档