Я наблюдаю следующее поведение в 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
.
Итак:
- Является ли это хорошо известным ограничением Visual Studio 2013 (возможно, затронуты другие версии)?
- Есть ли способ заставить компилятор использовать надлежащий базовый тип для перечисления стиля c ++ 98?Или мне нужно переключиться на нотацию c ++ 11 с фиксированным типом?
Обновление: как предложено, я сообщил о проблеме по адресу: