On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 05.02.13 12:39. Заголовок: 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.


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]





ссылка на сообщение  Отправлено: 24.01.15 21:33. Заголовок: Этот дефект стандарт..


Этот дефект стандарта уже в настоящее время исправлен. Так, например, в рабочем проекте стандарта N3797 от 2013-10-13 этот вышеуказанный параграф переписан в соответствии с моим предложением один к одному:

— If no initializer is specified for the first enumerator, the initializing value has an unspecified signed integral type.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 23
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет