在C ++ 11中,我声明了以下联合:
union U4 {
char c;
int i;
static int si;
};
当我使用-std = c ++ 11 -pedantic-errors使用g ++ 4.7.0编译此代码时,出现以下错误(进行少量编辑):
错误:本地类'union U4'不应该有静态数据成员'int U4 :: si'[-fpermissive]
错误:'U4 :: si'可能不是静态的,因为它是联合的成员
据我所知,FDIS(N3242)并未明确允许命名联合的静态数据成员。但是我也不知道FDIS 不允许命名联合的静态数据成员在哪里FDIS确实反复提到可以用什么做什么"非静态数据成员" [第9.5条第1款]。相比之下,这表明该标准允许工会的静态数据成员。
我对联盟的静态数据成员没有任何用处。如果我需要它,我可能会对包含匿名联合的类产生足够接近的效果。我只是想了解标准的意图。
感谢您的帮助。
答案 0 :(得分:5)
是的,这是允许的。标准的第9节对类,结构和联合使用单词class
,除非它明确提到这一点。静态工会成员的唯一限制是针对地方工会(9.4.2 / 5)和匿名工会(9.5 / 5)。
#include <iostream>
union Test
{
static int s;
};
int Test::s;
int main()
{
Test::s = 1;
std::cout << Test::s;
}
LiveWorkSpace上的输出。请注意,它在Clang 3.2上编译,但不在gcc 4.8.0或Intel 13.0.1上编译。看来这是gcc / Intel的错误。