MSVC:为什么在没有事先声明的情况下使用枚举可以编译?

Seb*_*lke 3 c++ enums declaration visual-c++ language-lawyer

在使用 C++ 时,我发现以下代码

enum E* kind;
int main() { }
Run Code Online (Sandbox Code Playgroud)

在 MSVC v19.latest 上编译。我预计这会失败,因为E尚未宣布。GCC 和 Clang 给出适当的错误消息

错误:使用枚举“E”而没有事先声明

错误:ISO C++ 禁止前向引用“enum”类型

分别。

为什么上面的代码可以在MSVC上编译?MSVC 不遵循标准吗?是 UB、错误还是功能?

Bri*_*ian 6

为什么上面的代码可以在 MSVC 上编译?

因为您是在启用 Microsoft 扩展的情况下进行编译的。

与许多实现一样,MSVC 默认情况下会偷偷启用它们。

MSVC 不遵循标准吗?

C++ 标准表明您的代码不是有效的 C++。然而,没有什么可以阻止实现扩展C++ 语言以赋予非合法 C++ 程序以意义。这就是 MSVC 正在做的事情。

如果您在禁用语言扩展的情况下进行编译,MSVC v19.latest 将拒绝它并显示错误消息

error C3432: 'E': a forward declaration of an unscoped enumeration must have an underlying type
Run Code Online (Sandbox Code Playgroud)