【发布时间】:2019-08-29 16:39:51
【问题描述】:
我在 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++ 标准 (Standard C++ 7.2/5),这是无效的 c++ 行为。在这种情况下,我不应该被要求显式定义底层类型,因为枚举器的值不适合 int 或 unsigned int。
所以:
- 这是 Visual Studio 2013 众所周知的限制吗(可能其他版本会受到影响)?
- 有没有办法强制编译器为 c++98 风格的枚举使用正确的底层类型?还是我需要切换到具有固定类型的 c++11 表示法?
更新:按照建议,我在以下位置报告了一个问题:
【问题讨论】:
-
最新的 VC 编译器给出了相同的 result.gcc 和 clang - 8 和 8(如预期的那样)。看起来像一个 VC 错误
-
在 MSVC 上打印
V会得到-1,奇怪。 -
没有警告
/Wall或/permissive-与 VS 2017 (15.9)。您应该将此作为错误提交到 VS Connect。 -
差别不大,但使用current draft 通常是个好主意。