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