整数常量是如此之大,以至于在将最大类型值分配给枚举时它是无符号的

时间:2015-11-19 13:22:08

标签: c++ c++11 gcc enums

这是我的枚举声明:

enum connection_primary_identifier_e : uint64_t
{
    INVALID_IDENTIFIER = std::numeric_limits<std::underlying_type<connection_primary_identifier_e>::type>::max(),
}

(如果我直接使用uint64_t作为类型,同样如果我使用-1-1ULL

当我尝试编译文件时,我收到以下错误/警告:

error: integer constant is so large that it is unsigned [-Werror]
error: narrowing conversion of ‘18446744073709551615I128’ from ‘__int128’ to ‘unsigned int’ inside { } [-Werror=narrowing]
error: large integer implicitly truncated to unsigned type [-Werror=overflow]
cc1plus: all warnings being treated as errors

真的很奇怪的是,错误实际上是在另一个文件(使用枚举)上为不存在的行(行号在文件的最后一行之后是3)产生的,我确定它不是&#39; ta缺少括号或类似的东西。

更新: 使用uint32_t不会产生错误。

使用g ++(GCC)4.8.3

1 个答案:

答案 0 :(得分:1)

可能因为std::underlying_type最初未指定且不需要完整类型。这无意中允许使用connection_primary_identifier_e但仍然不完整的代码。

从C ++ 17开始,您的代码绝对是非法的。