Для оценки инициализируют объект типа 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) для немассива полный тип объекта или (возможно квалифицированный к условной цене)void
введите, создает rvalue указанного типа, который инициализируется значением
7.1.5.2 говорит, "простые спецификаторы типа", и следует со списком, который включает unsigned
и int
.
Поэтому, учитывая, что в 5.2.3/2, "простой спецификатор типа" исключителен, и unsigned
и int
два спецификатора типа, примеры выше того использования unsigned int
недопустимый? (и, если так, продолжение, действительно ли это неправильно для Microsoft, и Intel для поддержки заявил выражения?)
Этот вопрос больше вне любопытства, чем что-либо еще; для всех типов, указанных комбинацией нескольких простых спецификаторов типа, инициализация значения эквивалентна для обнуления инициализации. (Этот вопрос был запрошен комментариями в ответ на этот ответ на вопрос об инициализации).
Я отправил этот вопрос на comp.lang.c ++. Moderated .
Даниэль Крюглер из комитета по стандартам C ++ согласился с интерпретацией, что unsigned int
представляет собой комбинацию описателей простого типа и не является сам по себе описателем простого типа.
Относительно заголовка таблицы 7 , на которую ссылается Джерри Коффин , Крюглер говорит:
Я согласен с тем, что заголовок таблицы 7 (которая является таблицей 9 в самом последнем проекте N3000 ) несколько вводит в заблуждение, но предыдущий текст в [dcl.type.simple] / 2 кажется мне очень ясным, когда он говорит:
Таблица 7 суммирует допустимые комбинации спецификаторов простого типа { {1}} и типы, которые они определяют. "
(Прошу прощения, что мне потребовалось так много времени, чтобы опубликовать это здесь из группы новостей; это совершенно вылетело из моей памяти)
7.1.5.2:
Простые тип-спецификаторы указывают либо ранее объявленный пользовательский тип или один из фундаментальных типов.
Это подразумевает, что intsigned INT I = int ()
является законным, поскольку incigned int
является фундаментальным типом (и, следовательно, простой тип-спецификатор , см. 3.9.1).
То же самое относится к типам, таких как:
long double
long long
long long int
unsigned long
unsigned long long int
short int
...
HMM, иногда вам нужен Typedef. Если это не говорит, что диагностика требуется, то для них не будет неверно поддерживать это. Тем не менее, для портативности вы можете использовать TypEDEF ( uint16_t
или uint64_t
, хотя те могут быть не правы), или процитируйте типенное значение с шаблоном:
iterator<void, unsigned long>::value_type( 5 )
Как это для необоснованно Verbose?
Редактировать: DUH или просто 5UL
. Это листья без знака
, unsigned Char
, а подписали CHAR
как единственные типы, которые вы не можете легко скорее строить.