C ++ 11是否允许非匿名联合包含静态数据成员?

时间:2013-04-14 06:18:19

标签: c++ c++11 static-members unions

在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款]。相比之下,这表明该标准允许工会的静态数据成员。

我对联盟的静态数据成员没有任何用处。如果我需要它,我可能会对包含匿名联合的类产生足够接近的效果。我只是想了解标准的意图。

感谢您的帮助。

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的错误。