无范围枚举的基础类型?

mal*_*lat 13 c++ visual-studio-2013

我在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;
}
Run Code Online (Sandbox Code Playgroud)

编译后将导致:

$ ./enum.exe
4
8
Run Code Online (Sandbox Code Playgroud)

如果我正确理解c ++标准(Standard C ++ 7.2 / 5),则这是无效的c ++行为。在这种情况下,由于枚举器的值不能适合int或,因此不需要显式定义基础类型unsigned int

所以:

  1. 这是Visual Studio 2013的众所周知的限制(也许其他版本也会受到影响)吗?
  2. 有没有一种方法可以强制编译器为c ++ 98样式枚举使用适当的基础类型?还是我需要使用固定类型切换到c ++ 11表示法?

更新:按照建议,我在以下位置报告了问题:

dar*_*une 1

参考文献的内容如下(重要部分加粗):

声明一个无作用域的枚举类型,其基础类型不固定(在这种情况下,基础类型是实现定义的整型,可以表示所有枚举数值;此类型不大于 int ,除非枚举数的值无法容纳在int 或 unsigned int。如果枚举器列表为空,则基础类型就好像枚举具有值为 0 的单个枚举器。

无作用域枚举类型的值可以隐式转换为整型。如果基础类型不固定,则该值可转换为以下列表中能够保存其整个值范围的第一个类型: int、unsigned int、long、unsigned long、long long 或unsigned long long。如果基础类型是固定的,则可以将值转换为其提升的基础类型。

综合起来,很明显这是的一个 bug (可能是在某个时候引入的)。更糟糕的是,它对此保持沉默。