Основной тип перечисления unscoped? - программирование

Основной тип перечисления unscoped?

Я наблюдаю следующее поведение в Visual Studio 2013 (отладка /Win32 компиляция). Рассмотрим следующий код c++:

#include <iostream>
#include <climits>

int main(int argc, char *argv[])
{
  enum { V = (unsigned long long)ULLONG_MAX } E;
  std::cout << sizeof E << std::endl;

  enum : unsigned long long { W = (unsigned long long)ULLONG_MAX } F;
  std::cout << sizeof F << std::endl;

  return 0;
}

После компиляции это приводит к:

$ ./enum.exe
4
8

Если я правильно понимаю стандарт c++ (Стандарт c++ 7.2/5), это неправильное поведение c++. В этом случае мне не нужно явно определять базовый тип, поскольку значение перечислителя не может помещаться в int или unsigned int.

Так:

  1. Это хорошо известное ограничение Visual Studio 2013 (может быть, затронуты другие версии)?
  2. Есть ли способ заставить компилятор использовать правильный базовый тип для перечисления стиля c++ 98? Или я должен перейти на нотацию c++ 11 с фиксированным типом?

Обновление: как предложено, я сообщил о проблеме в:

4b9b3361

Ответ 1

Ссылка говорит следующее (важные части выделены жирным шрифтом):

Объявляет тип перечисления с незаданной областью, базовый тип которого не является фиксированным (в данном случае базовый тип является целочисленным типом, определяемым реализацией, который может представлять все значения перечислителя; этот тип не больше, чем int, если значение перечислителя не может поместиться в int или unsigned int. Если список-перечислитель пуст, базовый тип такой, как если бы перечисление имело единственный перечислитель со значением 0).

а также

Значения перечислимого типа с незаданной областью неявно преобразуются в целочисленные типы. Если базовый тип не является фиксированным, значение может быть преобразовано в первый тип из следующего списка, который может содержать весь диапазон значений: int, unsigned int, long, unsigned long, long long или unsigned long long. Если базовый тип является фиксированным, значения могут быть преобразованы в их повышенный базовый тип.

В совокупности ясно, что это ошибка в (возможно, появившаяся в какой-то момент). Что еще хуже, так это то, что он молчит об этом.