匿名union能否仅用const修饰(而非constexpr)?哪种编译器处理正确?
匿名const union的标准合规性分析
先看示例代码:
int main() { const union { int i = 0; }; i = 1; }
这段代码尝试给匿名union添加const限定符,其成员i会注入到外围作用域,不同编译器的处理存在明显分歧:
- MSVC:接受该union声明,但拒绝执行
i = 1,报错提示error C3892: '$S1': you cannot assign to a variable that is const - GCC:无任何警告地接受整个程序,直接忽略
const前缀 - Clang:在
-pedantic-errors模式下直接报错,提示anonymous union cannot be 'const' [-Werror,-Wpedantic]
哪种处理符合C++标准?
根据C++标准规定,匿名union的声明不能带有类型限定符(包括const)。匿名union本质上不是一个独立的对象,它的成员会直接成为外围作用域的变量,给它添加const这类限定符属于语法错误。
因此:
- Clang在严格模式下的报错完全符合标准,它准确指出了代码中的语法违规问题。
- MSVC的处理错误:它首先允许了非法的
const匿名union声明,后续又错误地将成员视为const变量,整个流程不符合标准要求。 - GCC的处理也不符合标准:它直接忽略了
const限定符,默许了语法违规的代码,违背了标准规定。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

