C++ 大小和大小不一致

C++ 大小和大小不一致,c++,sizeof,C++,Sizeof,如果不包含头文件就无法定义本机运算符的结果,这不是很麻烦吗 据此,size\u t在头文件cstddef、cstdio、cstring、ctime和cstdlib中定义。因此,如果这两个标题都不包括,那么size\t应该是未定义的。但是,以下程序编译时没有任何警告(使用MSVC 2015RC) 似乎size\u t在某种程度上介于原生类型和typedef之间。标准怎么说?5.3.3尺寸[expr.Sizeof] 1) sizeof运算符生成对象中的字节数 其操作数的表示形式。操作数可以是表达式,

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

据此,
size\u t
在头文件cstddef、cstdio、cstring、ctime和cstdlib中定义。因此,如果这两个标题都不包括,那么
size\t
应该是未定义的。但是,以下程序编译时没有任何警告(使用MSVC 2015RC)


似乎
size\u t
在某种程度上介于原生类型和typedef之间。标准怎么说?

5.3.3尺寸[expr.Sizeof]

1) sizeof运算符生成对象中的字节数 其操作数的表示形式。操作数可以是表达式, 哪一个是未赋值的操作数(第5条)或带括号的操作数 type-id。sizeof运算符不得应用于表达式 具有函数或不完整类型的,以括号中的名称 这类类型,或指定位字段的glvalue。sizeof(char), sizeof(有符号字符)和sizeof(无符号字符)为1。结果 适用于任何其他基本类型(3.9.1)的sizeof为 实现定义。[注:特别是sizeof(bool), sizeof(char16_t)、sizeof(char32_t)和sizeof(wchar_t)是 实施-1.75-结束注释][注:见1.7了解 字节定义和3.9对象定义 陈述-结束语]

6) sizeof和sizeof的结果。。。是std::size\u t类型的常量。 [注:标准标题
(18.2)。-结束注释]

但是,
std::size\t
只是一个类型别名。
sizeof
运算符可以返回其结果,而无需“访问”类型别名;
sizeof
的结果是一些基本类型(实现定义),然后在
中别名为
std::size\t


注意,在C++ +<代码> Type Fux< /Calp>或使用< /Calp>< Stult>不定义新类型>(即强类型),但只有别名(即它们的<代码> Type ID <代码>相同)。因此,在您的例子中,

auto
只是推断出由
sizeof
运算符返回的基本类型,它与类型别名
std::size\t
相同。编译器没有问题。

< P>根据C++标准,<代码> STD::SiZeSt<<代码>在<代码> <代码> > < /P> 5.3.3尺寸

6
sizeof
sizeof…
的结果是
std::size\u t类型的常量。
[注:
std::size\u t
在 标准标题
(18.2)。-结束注释]


好问题。实际上,如果用size\u t替换auto,它在VC++中编译得很好,但gcc会给出一个错误,这实际上取决于编译器的实现。有些编译器允许使用
size\t
而不包含任何头文件,而有些编译器不允许,但它们不应该包含头文件!在当前代码中,一切都很清楚-sizeof返回std::size_t的类型,但std::size_t只是unsigned int的同义词,因此它实际上返回unsigned int,而auto在本例中只是unsigned int。@DmitriSosnik
cstdef
与编译器无关。编译器独立于标头。构建时,决定在X平台上,
sizeof
的结果将是例如
unsigned long int
。然后,它附带的一致性标准库将
size\u t
定义为
unsigned long int
。只要您想确保您的类型“大”到足以存储基本上任何可能的可表示大小,就需要
size\u t
。否则,一些代码将使用
无符号int
,另一些代码将使用
无符号long
,移植它们将是一团混乱。@DmitriSosnik是的,我同意,客户不应该关心
size\u t
的基本类型,如果这是您的意思的话。只需透明地使用它。使用
nullptr
更有趣;至少
size\t
是某些无符号整数类型的别名,您可以用另一种方式编写+顺便说一句,@T.C.不得不说我仍然不能完全理解
nullptr
。我将花一次时间阅读标准。
int main()
{
    auto d_Size = sizeof( int );
    return 0;
}