缩小从int到long unsigned int {}的转换在C++ 11中是不正确的

Wil*_*dow 5 c c++ gcc-warning c++11 gcc4.8

当我运行下面的代码时 - 我收到警告"缩小从int到long的无符号int转换{}在C++ 11 [#Wnarrowing]中是不正确的.我正在使用GNU 4.8编译器.

typedef struct TableEntry
{
    unsigned long value;
    const char *label;
} TableEntry;

enum FunctionType
{
    NORMAL   = 0, 
    RANGE    = 1
};


TableEntry functionTypes[] = 
{
    {NORMAL,   "NORMAL"},
    {RANGE, "RANGE"}
};
Run Code Online (Sandbox Code Playgroud)

我不明白为什么编译器将enum视为int?
这是GCC 4.8中的错误吗?有没有解决方法?任何帮助表示赞赏.

Che*_*Alf 7

如果可行的话:

enum FunctionType
{
    NORMAL   = 0, 
    RANGE    = 1
};

typedef struct TableEntry
{
    FunctionType value;
    const char *label;
} TableEntry;


TableEntry functionTypes[] = 
{
    {NORMAL,   "NORMAL"},
    {RANGE, "RANGE"}
};
Run Code Online (Sandbox Code Playgroud)

否则,将结构中的类型更改为int,或者将枚举显式基于与结构中相同的类型.

顺便说一句,我认为g ++警告是没有根据的,错误的,因为原始代码是有效的C++ 03. 更正:据我所知,诊断是正确的,这是C++ 11中的一个重大变化.我简直不敢相信.


关于命名约定:所有大写标识符都适用于Java程序员(习惯于该约定),但在C++中,它们增加了无意中文本替换的可能性.还有审美方面的考虑因素.在保留宏的全部大写方面取得了很大的成功.