size_t和sizeof不一致

Hec*_*tor 29 c++ sizeof

如果不包含头文件,则无法定义本机运算符的结果,这是不是很麻烦?

根据此页面,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++中typedefusing 不定义新类型(即强类型),但只有别名(即它们typeid是相同的).因此,在您的情况下,auto只是推导出sizeof运算符返回的基本类型,它与类型别名相同std::size_t.编译器没问题.

  • 使用`nullptr`会更有趣; 至少`size_t`是某些无符号整数类型的别名,您可以用其他方式编写.+1,BTW. (3认同)