要初始化类型的对象T,可以执行以下某项操作:
T x = T();
T x((T()));
Run Code Online (Sandbox Code Playgroud)
我的问题涉及由简单类型说明符组合指定的类型,例如unsigned int:
unsigned int x = unsigned int();
unsigned int x((unsigned int()));
Run Code Online (Sandbox Code Playgroud)
Visual C++ 2008和英特尔C++编译器11.1接受这两个没有警告; Comeau 4.3.10.1b2和g ++ 3.4.5(不可否认,并非特别近期)没有.
根据C++标准(C++ 03 5.2.3/2,expr.type.conv):
表达式
T(),其中T是非数组完整对象类型的简单类型说明符(7.1.5.2)或(可能是cv限定的)void类型,创建指定类型的rvalue,它是值初始化的
7.1.5.2说,"简单类型说明符是",并跟随一个包含unsigned和的列表int.
因此,鉴于在5.2.3/2中,"simple-type-specifier"是单数,unsigned并且int是两个类型说明符,上面的例子是否使用unsigned int无效?(如果是这样,后续是,微软和英特尔是否支持所述表达式?)
这个问题更多是出于好奇而不是其他任何问题; 对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化.(这个问题是由回答关于初始化问题的答案的评论提示的).