编译以下内容时:
const static union {
float cMaskF;
int cMask = -1;
};
x86_64-w64-mingw32-gcc-5.2.0
成功,而i686-pc-cygwin-gcc-4.9.2
和4.9.3
都会出现以下错误:
未初始化的const'Uphil :: Math :: {anonymous} ::'[-fpermissive]
但是,以下情况也会产生错误,这是可以理解的......
const static union {
float cMaskF = 1.0f;
int cMask = -1;
};
union'Uphil :: Math :: {anonymous} ::'initialized
中的多个字段初始化'Uphil :: Math :: {anonymous} ::'
的多个成员
那么有没有办法让const静态匿名联合一致地编译?这是修复的旧版本中的错误,还是我不应该想要的“非标准”代码?无论如何,这似乎是一个有用的结构。
这都是在C ++ 11下编译的。即使使用-pedantic
,v5.2.0也会在没有任何警告的情况下成功。
答案 0 :(得分:1)
据我所知,这似乎是允许const匿名联盟的gcc扩展。这适用于example with gcc 5.2的更高版本的gcc。看起来使其适用于旧版本的唯一方法是使用-fpermissive标志,该标志降低了对不符合代码的警告,但这可能并不理想。
另一方面,如果我们使用clang尝试此代码,如果我们使用-pedantic
标记( see it live ),则会提供以下警告:
警告:匿名工会不能成为' const' [-Wpedantic]
我们可以找到一个gcc错误报告:type-specifier const in declaration of anonymous union声称由于7.1.6.1
[dcl.type.cv] 而导致其格式不正确:
如果cv-qualifier出现在decl-specifier-seq中,那么 声明的init-declarator-list不应为空。
据我所知,这是正确的。我们被迫通过9.5
[class.union] 部分中匿名联合的定义得到一个空的 init-declarator-list :
表格
的联合union { member-specification } ;
被称为匿名联盟;它定义了一个未命名的未命名对象 类型。