Чтобы значение инициализировало объект типа 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
- это спецификатор простого типа (7.1.5.2) для типа объекта, не являющегося полным массивом, или (возможно, с квалификацией cv) void
, создает значение r указанный тип, который инициализируется значением
7.1.5.2 говорит «спецификаторы простого типа» и следует со списком, включающим unsigned
и int
.
Поэтому, учитывая, что в 5.2.3 / 2 «простой спецификатор типа» является единственным, а unsigned
и int
являются двумя спецификаторами типа, являются ли приведенные выше примеры, в которых используется unsigned int
недопустимым? (и, если да, то разве это неправильно для Microsoft и Intel поддерживать указанные выражения?)
Этот вопрос скорее из любопытства, чем что-либо еще; для всех типов, указанных комбинацией нескольких простых спецификаторов типов, инициализация значения эквивалентна нулевой инициализации. (Этот вопрос был вызван комментариями в ответ на этот ответ на вопрос об инициализации ).