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

Does C++11 allow non-anonymous unions to contain static data members?

本文关键字:包含 静态 数据成员 是否 许非匿 c++      更新时间:2023-10-16

在c++ 11中,我声明了以下联合:

union U4 {
    char c;
    int i;
    static int si;
};

当我用g++ 4.7.0使用-std=c++11 -pedantic-errors编译这段代码时,我得到了以下错误(稍微编辑):

错误:本地类union U4不能有静态数据成员int U4::si ' [-fpermissive]
error: ' U4::si '可能不是静态的,因为它是union的成员

据我所知,FDIS (N3242)没有显式地允许命名联合的静态数据成员。但是我也没有看到FDIS 禁止命名联合的静态数据成员。FDIS确实反复提到可以用"非静态数据成员"做什么[第9.5节第1段]。相比之下,这表明标准允许联合的静态数据成员。

我对联合的静态数据成员没有任何想法。如果我需要的话,我可以用包含匿名联合的类获得足够接近的效果。我只是想理解这个标准的意图。

谢谢你的帮助

是允许的。标准的第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上编译。