如果不包含头文件,则无法定义本机运算符的结果,这是不是很麻烦?
根据此页面,size_t在头文件cstddef,cstdio,cstring,ctime和cstdlib中定义.因此,如果这些标题都不包括在内,那么size_t应该是未定义的.但是,以下程序在没有任何警告的情况下编译(使用MSVC 2015RC).
int main()
{
auto d_Size = sizeof( int );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它似乎size_t在本机类型和typedef之间有点混蛋.标准说什么?
vso*_*tco 31
5.3.3 Sizeof [expr.sizeof]
1)sizeof运算符产生其操作数的对象表示中的字节数.操作数是一个表达式,它是一个未评估的操作数(第5章),或带括号的type-id.sizeof运算符不应该应用于具有函数或不完整类型的表达式,此类型的带括号的名称,或者应用于指定位字段的glvalue.sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1.应用于任何其他基本类型(3.9.1)的sizeof的结果是实现定义的.[注意:特别是,sizeof(bool),sizeof(char16_t),sizeof(char32_t)和sizeof(wchar_t)是实现定义的.75 - 结束注释] [注意:有关字节的定义,请参阅1.7,有关对象表示的定义. - 结束说明]
6)sizeof和sizeof ...的结果是std :: size_t类型的常量.[注意:std :: size_t在标准头文件中定义
<cstddef>(18.2). - 结束说明]
但是,std::size_t它只是一种类型别名.该sizeof操作人员无需任何需要"访问"的类型别名返回其结果; 的结果sizeof是一些基本类型(实现定义),然后将其别名为std::size_t在<cstddef>.
另请注意,在C++中typedef或using 不定义新类型(即强类型),但只有别名(即它们typeid是相同的).因此,在您的情况下,auto只是推导出sizeof运算符返回的基本类型,它与类型别名相同std::size_t.编译器没问题.