要初始化T
类型的对象,可以执行以下某项操作:
T x = T();
T x((T()));
我的问题涉及由简单类型说明符组合指定的类型,例如unsigned int
:
unsigned int x = unsigned int();
unsigned int x((unsigned int()));
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
type,创建一个指定类型的rvalue,它是值初始化的
7.1.5.2说“简单类型说明符是”,后面跟着包含unsigned
和int
的列表。
因此,鉴于在5.2.3 / 2中,“simple-type-specifier”是单数,unsigned
和int
是两个类型说明符,上面的示例使用{{1无效? (如果是这样,后续是,微软和英特尔是否支持所述表达式?)
这个问题更多是出于好奇而不是其他任何问题;对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化。 (这个问题是由comments in response to this answer to a question about initialization)提示的。
答案 0 :(得分:8)
我posted this question to comp.lang.c++.moderated。
C ++标准委员会的DanielKrügler同意unsigned int
是 简单类型说明符组合的解释,并且它本身不是一个简单的类型说明符。
关于表7 referenced by Jerry Coffin的标题,Krügler说:
我同意表7的标题(表9中最多 最近的草案N3000)有些误导,但前提 [dcl.type.simple] / 2中的文字对我来说非常清楚,当它说:
表7总结了simple-type-specifiers的有效组合 以及他们指定的类型。“
(很抱歉,我花了很长时间才从新闻组发回这里;这完全让我不知所措)
答案 1 :(得分:1)
嗯,有时你需要一个typedef。如果它没有说需要诊断,那么他们支持这个并不是不正确的。尽管如此,为了便于携带,您可以使用typedef(uint16_t
或uint64_t
,尽管这些可能不正确),或者使用模板引用typename:
iterator<void, unsigned long>::value_type( 5 )
对于不合理的冗长是怎么回事?
编辑:Duh,或简称5ul
。这使得unsigned short
,unsigned char
和signed char
成为您无法轻松明确构建的唯一类型。
答案 2 :(得分:1)
在§7.1.5.2中,继续阅读表7,其中包含允许作为简单说明符(包含“unsigned int”)的完整列表。
答案 3 :(得分:-2)
7.1.5.2:
simple-type-specifiers指定先前声明的用户定义类型或基本类型之一。
这意味着unsigned int i = unsigned int()
是合法的,因为unsigned int
是基本类型(因此是简单类型说明符,见3.9.1)。
同样适用于以下类型:
long double
long long
long long int
unsigned long
unsigned long long int
short int
...