要初始化一个类型的对象T
,可以按照以下方式之一做一些事情:
T x = T();
T x((T()));
我的问题涉及由简单类型说明符组合指定的类型,例如unsigned int
:
unsigned int x = unsigned int();
unsigned int x((unsigned int()));
Visual C++ 2008 和 Intel C++ Compiler 11.1 接受这两者,不会发出警告;Comeau 4.3.10.1b2 和 g++ 3.4.5(诚然,这不是最近的)没有。
根据 C++ 标准(C++03 5.2.3/2,expr.type.conv):
表达式
T()
,其中T
是非数组完整对象类型或(可能是 cv 限定的)void
类型的简单类型说明符(7.1.5.2),创建指定类型的右值,它是值初始化的
7.1.5.2 说,“简单类型说明符是”,然后是一个包含unsigned
and的列表int
。
因此,鉴于在 5.2.3/2 中,“simple-type-specifier”是单数的,unsigned
并且int
是两个类型说明符,那么上面使用的示例是否unsigned int
无效?(如果是这样,那么后续问题是,微软和英特尔支持上述表达方式是否不正确?)
这个问题更多是出于好奇。对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化。(这个问题是由回应这个关于初始化的问题的答案的评论提示的)。