在没有包含头文件的情况下无法定义本机运算符的结果是不是很麻烦?
根据此page,size_t
在标头cstddef,cstdio,cstring,ctime和cstdlib中定义。因此,如果这两个标头都不包括在内,那么size_t
应该是未定义的。但是,以下程序在没有任何警告的情况下编译(使用MSVC 2015RC)。
int main()
{
auto d_Size = sizeof( int );
return 0;
}
似乎size_t
在本机类型和typedef之间有点混蛋。标准说了什么?
答案 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 ++中typedef
或using
不定义新类型(即强类型),但只有别名(即他们的typeid
是相同的)。因此,在您的情况下,auto
只是推断出sizeof
运算符返回的基本类型,它与类型别名std::size_t
相同。编译器没问题。
答案 1 :(得分:4)
根据C ++标准,std::size_t
中定义了<cstddef>
。
5.3.3尺寸
...
6
sizeof
和sizeof...
的结果是std::size_t.
类型的常量[注意:std::size_t
定义于 标准标题<cstddef>
(18.2)。 - 结束记录]