首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数常量太大,以至于在将最大类型值赋给枚举时它是无符号的

整数常量太大,以至于在将最大类型值赋给枚举时它是无符号的
EN

Stack Overflow用户
提问于 2015-11-19 21:22:08
回答 1查看 1.5K关注 0票数 2

下面是我的枚举声明:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-11-20 00:08:31

可能是因为std::underlying_type最初被低估了,不需要完整的类型。这无意中允许这样的代码,它在connection_primary_identifier_e仍然不完整的时候使用了它。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33805165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档