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