Явное преобразование типов и несколько простых спецификаторов типа

Для оценки инициализируют объект типа 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 для поддержки заявил выражения?)

Этот вопрос больше вне любопытства, чем что-либо еще; для всех типов, указанных комбинацией нескольких простых спецификаторов типа, инициализация значения эквивалентна для обнуления инициализации. (Этот вопрос был запрошен комментариями в ответ на этот ответ на вопрос об инициализации).

8
задан Community 23 May 2017 в 12:16
поделиться

4 ответа

Я отправил этот вопрос на comp.lang.c ++. Moderated .

Даниэль Крюглер из комитета по стандартам C ++ согласился с интерпретацией, что unsigned int представляет собой комбинацию описателей простого типа и не является сам по себе описателем простого типа.

Относительно заголовка таблицы 7 , на которую ссылается Джерри Коффин , Крюглер говорит:

Я согласен с тем, что заголовок таблицы 7 (которая является таблицей 9 в самом последнем проекте N3000 ) несколько вводит в заблуждение, но предыдущий текст в [dcl.type.simple] / 2 кажется мне очень ясным, когда он говорит:

Таблица 7 суммирует допустимые комбинации спецификаторов простого типа { {1}} и типы, которые они определяют. "

(Прошу прощения, что мне потребовалось так много времени, чтобы опубликовать это здесь из группы новостей; это совершенно вылетело из моей памяти)

8
ответ дан 5 December 2019 в 20:16
поделиться

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
...
-2
ответ дан 5 December 2019 в 20:16
поделиться

HMM, иногда вам нужен Typedef. Если это не говорит, что диагностика требуется, то для них не будет неверно поддерживать это. Тем не менее, для портативности вы можете использовать TypEDEF ( uint16_t или uint64_t , хотя те могут быть не правы), или процитируйте типенное значение с шаблоном:

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

Как это для необоснованно Verbose?

Редактировать: DUH или просто 5UL . Это листья без знака , unsigned Char , а подписали CHAR как единственные типы, которые вы не можете легко скорее строить.

1
ответ дан 5 December 2019 в 20:16
поделиться

.

1
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: