显式类型转换和多个简单类型说明符

Jam*_*lis 8 c++ value-initialization

要初始化类型的对象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无效?(如果是这样,后续是,微软和英特尔是否支持所述表达式?)

这个问题更多是出于好奇而不是其他任何问题; 对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化.(这个问题是由回答关于初始化问题的答案评论提示的).

Jam*_*lis 8

把这个问题发布到comp.lang.c ++.moderated.

C++标准委员会的DanielKrügler同意这种解释unsigned int是简单类型说明符的组合,并且它本身不是一个简单的类型说明符.

关于Jerry Coffin引用的表7的标题,Krügler说:

我同意表7的标题(最近的草案N3000中的表9)有些误导,但[dcl.type.simple]/2中的前面文本对我来说非常清楚,当它说:

表7总结了简单类型说明符的有效组合及其指定的类型."

(很抱歉,我花了很长时间才从新闻组发回这里;这完全让我不知所措)