constexpr 静态从 int 转换为具有非固定基础类型的无作用域枚举的未定义行为在 C++17 中编译

Undefined behavior of constexpr static cast from int to unscoped enum with non-fixed underlying type compiles in C++17

这是 的后续问题(scoped 枚举的相同问题)。 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. 如果应该,为什么?

查看其他 post 以了解为什么我认为它不应该为 unscoped 枚举编译的详细推理。同样的道理也适用于这个问题。

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

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