size_t和sizeof不一致

时间:2015-05-13 05:02:24

标签: c++ sizeof

在没有包含头文件的情况下无法定义本机运算符的结果是不是很麻烦?

根据此pagesize_t在标头cstddef,cstdio,cstring,ctime和cstdlib中定义。因此,如果这两个标头都不包括在内,那么size_t应该是未定义的。但是,以下程序在没有任何警告的情况下编译(使用MSVC 2015RC)。

int main()
{
    auto d_Size = sizeof( int );
    return 0;
}

似乎size_t在本机类型和typedef之间有点混蛋。标准说了什么?

2 个答案:

答案 0 :(得分:31)

5.3.3 Sizeof [expr.sizeof]

  

1)sizeof运算符产生对象中的字节数   表示其操作数。操作数是表达式,   这是一个未评估的操作数(第5条),或带括号的   TYPE-ID。 sizeof运算符不应用于表达式   具有函数或不完整类型的,带括号的名称   这些类型,或指定位域的glvalue。的sizeof(char)的,   sizeof(signed char)和sizeof(unsigned char)是1.结果   sizeof应用于任何其他基本类型(3.9.1)是   实现定义。 [注意:特别是sizeof(bool),   sizeof(char16_t),sizeof(char32_t)和sizeof(wchar_t)是   implementation-defined.75 - end note] [注:见1.7   字符的定义和对象定义的3.9   表示。 - 结束说明]

     

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相同。编译器没问题。

答案 1 :(得分:4)

根据C ++标准,std::size_t中定义了<cstddef>

  

5.3.3尺寸

     

...

     

6 sizeofsizeof...的结果是std::size_t.类型的常量[注意: std::size_t定义于   标准标题<cstddef>(18.2)。 - 结束记录]