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、错误还是功能?
为什么上面的代码可以在 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)
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |