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无效?(如果是这样,后续是,微软和英特尔是否支持所述表达式?)
这个问题更多是出于好奇而不是其他任何问题; 对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化.(这个问题是由回答关于初始化问题的答案的评论提示的).
我把这个问题发布到comp.lang.c ++.moderated.
C++标准委员会的DanielKrügler同意这种解释unsigned int是简单类型说明符的组合,并且它本身不是一个简单的类型说明符.
关于Jerry Coffin引用的表7的标题,Krügler说:
我同意表7的标题(最近的草案N3000中的表9)有些误导,但[dcl.type.simple]/2中的前面文本对我来说非常清楚,当它说:
表7总结了简单类型说明符的有效组合及其指定的类型."
(很抱歉,我花了很长时间才从新闻组发回这里;这完全让我不知所措)