下面是我的枚举声明:
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)产生的,我确保它不会丢失括号或类似的东西。
更新:使用uint32_t不会产生错误。
使用g++ (GCC) 4.8.3
发布于 2015-11-20 00:08:31
可能是因为std::underlying_type最初被低估了,不需要完整的类型。这无意中允许这样的代码,它在connection_primary_identifier_e仍然不完整的时候使用了它。
从C++17开始,你的代码绝对是非法的。
https://stackoverflow.com/questions/33805165
复制相似问题