8

要初始化一个类型的对象T,可以按照以下方式之一做一些事情:

T x = T();
T x((T()));

我的问题涉及由简单类型说明符组合指定的类型,例如unsigned int

unsigned int x = unsigned int();
unsigned int x((unsigned int()));

Visual C++ 2008 和 Intel C++ Compiler 11.1 接受这两者,不会发出警告;Comeau 4.3.10.1b2 和 g++ 3.4.5(诚然,这不是最近的)没有。

根据 C++ 标准(C++03 5.2.3/2,expr.type.conv):

表达式T(),其中T是非数组完整对象类型或(可能是 cv 限定的)void类型的简单类型说明符(7.1.5.2),创建指定类型的右值,它是值初始化的

7.1.5.2 说,“简单类型说明符是”,然后是一个包含unsignedand的列表int

因此,鉴于在 5.2.3/2 中,“simple-type-specifier”是单数的,unsigned并且int是两个类型说明符,那么上面使用的示例是否unsigned int无效?(如果是这样,那么后续问题是,微软和英特尔支持上述表达方式是否不正确?)

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

4

4 回答 4

8

将此问题发布到 comp.lang.c++.moderated

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

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

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

表 7 总结了简单类型说明符的有效组合以及它们指定的类型。”

(很抱歉,我花了这么长时间才从新闻组发回这里;它完全让我忘记了)

于 2010-03-12T18:45:20.070 回答
1

嗯,有时你需要一个 typedef。如果它没有说需要诊断,那么他们支持这一点并没有错。尽管如此,为了可移植性,您可以使用 typedef (uint16_tuint64_t,尽管这些可能不正确),或者使用模板引用类型名:

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

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

编辑:呃,或者简单地说5ul。这留下unsigned short,unsigned charsigned char作为唯一不能轻易显式构造的类型。

于 2010-01-27T03:01:39.933 回答
1

在第 7.1.5.2 节中,继续阅读表 7,其中包含允许作为简单说明符的完整列表(其中包括“unsigned int”)。

于 2010-01-27T03:06:21.637 回答
-2

7.1.5.2:

简单类型说明符指定先前声明的用户定义类型或基本类型之一

这意味着它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
...
于 2010-01-27T10:08:19.063 回答