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::typeinfo
typeinfo
基本上,您将实体(空指针常量类型)与名称( std::nullptr_t
)混为一谈
如果您问为什么语言设计者没有指定nullptr_t
andtypeinfo
作为关键字,我推测它们不够常见,不会冒与具有相同拼写的用户定义名称发生名称冲突的风险。回想一下,这样的冲突会发生在任何和所有范围内。
归档时间: |
|
查看次数: |
4012 次 |
最近记录: |