Основной тип перечисления unscoped? - PullRequest
13 голосов
/ 08 апреля 2019

Я наблюдаю следующее поведение в 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 с фиксированным типом?

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

1 Ответ

1 голос
/ 13 мая 2019

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

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

и

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

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

...