在C++17中编译具有非固定底层类型的constexpr静态从int强制转换为无范围枚举的未定义行为



这是C++17中编译的具有非固定底层类型的constexpr静态从int强制转换到作用域枚举的未定义行为的后续问题(与作用域枚举的问题相同(。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. 如果应该,为什么

请参阅另一篇文章,了解我认为它不应该为unscoped枚举编译的详细原因。同样的道理也适用于这个问题。

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

这是GCC错误#95701。我找不到Clang的漏洞。

相关内容

  • 没有找到相关文章

最新更新