MWi*_*Wid 9 c++ types nullptr c++11
标准状态,即nullptr类型std::nullptr_t(2.14.7)的指针文字.并且18.2p9定义nullptr_t了
namespace std {
typedef decltype(nullptr) nullptr_t;
}
Run Code Online (Sandbox Code Playgroud)
7.1.6.2p4 decltype(nullptr)是表达式的类型,nullptr根据定义std::nullptr_t(因为表达式nullptr是prvalue).将其代入nullptr_t结果的定义中
typedef nullptr_t nullptr_t
Run Code Online (Sandbox Code Playgroud)
另一方面,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;
Run Code Online (Sandbox Code Playgroud)
我可以说表达式的类型:
42
Run Code Online (Sandbox Code Playgroud)
是foo.然而,foo它只是另一种类型(int)的别名.
内部有一个实体是空指针常量类型。它是基本类型之一。
关键字、文字和表达式都nullptr具有这种类型。 decltype(nullptr)指的是这种类型。
然而,该名称 std::nullptr_t不是关键字(甚至不是上下文相关的关键字),因此该名称在声明之前并不存在。如果您在未声明的情况下引用该名称std::nullptr_t,则与任何未声明的名称一样,这是一个错误。
因此,尽管该类型像任何基本类型一样在翻译开始时就存在,但该名称并不存在。
事实上,还有其他没有“单一拼写”的基本类型,例如短整型。短整型可以称为short、short int、signed short int、signed short、 或其任何排列。
它与运算符(关键字)和表达式typeid类型之间的关系也没有什么不同。 也不是关键字,并且该名称在声明之前不存在。typeid(...)std::typeinfotypeinfo
基本上,您将实体(空指针常量类型)与名称( std::nullptr_t)混为一谈
如果您问为什么语言设计者没有指定nullptr_tandtypeinfo作为关键字,我推测它们不够常见,不会冒与具有相同拼写的用户定义名称发生名称冲突的风险。回想一下,这样的冲突会发生在任何和所有范围内。
| 归档时间: |
|
| 查看次数: |
4012 次 |
| 最近记录: |