Форум » C/C++ » Enumeration declarations. A C++ Standard Defect. » Ответить

Enumeration declarations. A C++ Standard Defect.

Сыроежка: Стандарт С++ имеет дефект относительно описания объявлений перечислений. В параграфе №5 раздела "7.2 Enumeration declarations" написано следующее: "If the underlying type is not fixed, the type of each enumerator is the type of its initializing value: — If an initializer is specified for an enumerator, the initializing value has the same type as the expression. — If no initializer is specified for the first enumerator, the initializing value has an unspecified integral type. — Otherwise the type of the initializing value is the same as the type of the initializing value of the preceding enumerator unless the incremented value is not representable in that type, in which case the type is an unspecified integral type sufficient to contain the incremented value. If no such type exists, the program is ill-formed." Обратите внимание на выделенные слова из процитированного параграфа. Это определение ведет к неоднозначному выводу значений для перечислительных констант. Рассмотрим следующий пример: enum { zero, one = zero - 1, two }; Если в этом примере целочисленным типом первой перечислительной константы с именем zero, которая не имеет инициализирующего значения, будет тип unsigned int, то следующая перечислительная константа будет иметь значение UINT_MAX. В таком случае перечислительная константа с именем two будет иметь значение UINT_MAX + 1, а ее типом будет некоторый целочисленный тип, который может в себя вмещать данное положительное значение. Если, однако, в этом примере целочисленным типом первой перечислительной константы с именем zero, которая не имеет инициализирующего значения, будет тип signed int, то следующая перечислительная константа будет иметь значение -1. В таком случае перечислительная константа с именем two уже будет иметь значение, равное 0 (на единицу больше, чем значение предыдущей перечислительной константы). В итоге мы получаем неоднозначность значений перечислительных констант и не можем заранее сказать, какое значение будет у текущей перечислительной константы. Это противоречие можно снять, если к пункту стандарта добавить слово signed, то есть если соответствующий пункт будет сформулирован следующим образом: — If no initializer is specified for the first enumerator, the initializing value has an unspecified signed integral type.

Ответов - 1

Сыроежка: Этот дефект стандарта уже в настоящее время исправлен. Так, например, в рабочем проекте стандарта N3797 от 2013-10-13 этот вышеуказанный параграф переписан в соответствии с моим предложением один к одному: — If no initializer is specified for the first enumerator, the initializing value has an unspecified signed integral type.



полная версия страницы