【发布时间】:2010-01-27 01:40:20
【问题描述】:
要对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 和int 的列表。
因此,鉴于在 5.2.3/2 中,“simple-type-specifier”是单数,而unsigned 和int 是两个类型说明符,那么上面使用unsigned int 的示例是否无效? (如果是,那么后续的问题是,微软和英特尔支持上述表达方式是否不正确?)
这个问题更多是出于好奇;对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化。 (这个问题是comments in response to this answer to a question about initialization提示的)。
【问题讨论】:
-
你怎么敢质疑我。 :3 我认为表达式
(unsigned int)命名了一个类型。 -
@GMan:
(unsigned int)()使用 gcc 3 和 4 以及 VC8 失败。typedefed 版本当然可以。 -
H米。 :(