首页 > 解决方案 > 从 int 到具有非固定基础类型的无范围枚举的 constexpr 静态转换的未定义行为在 C++17 中编译

问题描述

这是 constexpr static cast from int to scoped enum 的未定义行为的后续问题,在 C++17 中使用非固定基础类型编译(范围枚举的问题相同)。TLDR 是作用域枚举始终具有固定的基础类型(默认情况下为 int,因此您始终可以从 int 转换为作用域枚举)。

我想知道以下是否应该或不应该在 C++17 中编译

enum E
{
    A, B
};

constexpr E x = static_cast<E>(2);

这在 Ubuntu 20.04 上与 GCC 9.3.0 和 Clang 10.0.0 一起编译。

我的问题是

  1. 这应该编译吗?
  2. 如果应该,为什么?

有关我认为它不应该为无范围枚举编译的详细原因,请参阅另一篇文章。同样的推理也适用于这个问题。

标签: c++enumsc++17undefined-behaviorconstexpr

解决方案


它不应该编译。这是一个编译器错误。在CWG 1766中未定义它的原因是,这种转换将在常量表达式中得到诊断。

这是GCC 错误 #95701。我找不到 Clang 的开放错误。


推荐阅读