【问题标题】:integer constant is so large that it is unsigned when assigning max type value to enum整数常量太大以至于在将最大类型值分配给枚举时它是无符号的
【发布时间】:2015-11-19 13:22:08
【问题描述】:

这是我的枚举声明:

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

【问题讨论】:

  • 无法重现 (g++ --version = g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4)。您是否不小心编译/包含了另一个版本的枚举?
  • 它正在工作here
  • 请注意,这些是被视为错误的警告,另外,我已经用正确的 GCC 版本更新了问题,对此感到抱歉。
  • 准备一个产生相同警告的 MVCE(例如添加 #include &lt;limits&gt;),使用 -c 仅编译该文件,并使用 -v 进行详细输出。将 MVCE 和详细的编译器输出添加到您的问题中。它可能是一个特定于 4.8.3 的错误,但我无法想象会发生这样的事情(它也不在错误跟踪器中)。
  • @Zeta,我尝试使用在线编译器重现它,但我没有这样做,另一方面,我没有找到任何允许我选择编译器版本的在线网站。

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


【解决方案1】:

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

从 C++17 开始,你的代码肯定是非法的。

【讨论】:

  • 我使用uint64_t时也发生了同样的情况,所以我不确定underlying_type是这里的问题
猜你喜欢
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多