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

时间:2010-01-27 01:40:20

标签: c++ value-initialization

要初始化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说“简单类型说明符是”,后面跟着包含unsignedint的列表。

因此,鉴于在5.2.3 / 2中,“simple-type-specifier”是单数,unsignedint是两个类型说明符,上面的示例使用{{1无效? (如果是这样,后续是,微软和英特尔是否支持所述表达式?)

这个问题更多是出于好奇而不是其他任何问题;对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化。 (这个问题是由comments in response to this answer to a question about initialization)提示的。

4 个答案:

答案 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_tuint64_t,尽管这些可能不正确),或者使用模板引用typename:

iterator<void, unsigned long>::value_type( 5 )

对于不合理的冗长是怎么回事?

编辑:Duh,或简称5ul。这使得unsigned shortunsigned charsigned 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
...