采取以下标准段落:
[C++11: 5.3.3/6]:结果sizeof和sizeof...是类型的常量std::size_t.[注意:std::size_t在标准标题<cstddef>(18.2)中定义. - 尾注]
现在:
[C++11: 18.2/6]:该类型size_t是一个实现定义的无符号整数类型,其大小足以包含任何对象的字节大小.
当然,该段落并不要求这size_t是一个定义的类型别名typedef,但由于它明确声明可以通过标准标题提供<cstddef>,我认为我们可以认为如果没有包含它<cstddef>应该删除任何size_t可用的保证.一个程序.
但是,根据第一个引用,我们可以无论如何获得类型的表达式std::size_t.
int main()
{
typedef decltype(sizeof(0)) my_size_t;
my_size_t x = 0; // OK
std::size_t y = 1; // error: 'size_t' is not a member of 'std'
}
Run Code Online (Sandbox Code Playgroud)
std::size_t该程序不可见,但sizeof(0)仍然给我们一个?真?
因此,说它5.3.3/6是有缺陷的,并且它实际上具有"与std::size_t解决的任何类型相同的类型",而不是 std::size_t它本身,这是不正确的吗?
当然,如果 …
正如为什么nullptr_t不是关键字所讨论的那样,最好避免引入新关键字,因为它们可能会破坏向后兼容性.
为什么然后是char16_t和char32_t关键词,当他们可以这样定义?
namespace std {
typedef decltype(u'q') char16_t;
typedef decltype(U'q') char32_t;
}
Run Code Online (Sandbox Code Playgroud) 在C++ 11中添加了override说明符和final说明符.它们与添加到C++ 11中的其他说明符(例如constexpr和decltype)不同,因为它们不是关键字,因此可用作标识符:
int main()
{
int override = 0 ; // Ok
int final = 0 ; // Ok
//int constexpr = 0 ; // Error
}
Run Code Online (Sandbox Code Playgroud)
它们被称为具有特殊含义的标识符,在C++ 11标准部分2.11 [lex.name](强调我的)草案中有所涉及:
表3中的标识符在出现在特定上下文中时具有特殊含义.当在语法中引用时,显式地使用这些标识符而不是使用标识符语法生成.任何关于给定标识符是否具有特殊含义的歧义都被解析为将该标记解释为常规标识符.
和表3 - 具有特殊含义列表的标识符都覆盖和最终.
为什么这两个说明符最终成为具有特殊含义的标识符而不是关键字?
标准状态,即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?我无法理解这些定义.