7

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

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

当我使用 g++ 4.7.0 使用 -std=c++11 -pedantic-errors 编译此代码时,我收到以下错误(经过少量编辑):

错误:本地类“联合 U4”不应具有静态数据成员“int U4::si”[-fpermissive]
错误:“U4::si”可能不是静态的,因为它是联合的成员

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

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

谢谢您的帮助。

4

1 回答 1

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

于 2013-04-14T07:48:02.300 回答