为什么需要将全局匿名联合声明为静态?

Vat*_*san 6 c++ anonymous-types unions c++11

C++ 0x草案

9.5.6在命名空间或全局命名空间中声明的匿名联合应声明为静态.

为什么?


最新情况:

基于Bart van Ingen Schenau和Lothar的回应,到目前为止最好的解释可能是:

如果在两个翻译单元中遇到相同的全局匿名联合(例如,通过头文件),那么如何满足一个定义规则?这两个定义是否被视为相同并合并在一起?或者这两个定义是否被视为不同?如果它们被视为相同,那么编译器可能正在做"魔术",否则对其他实体不起作用.如果它们被视为相同,那么编译器在没有程序员的明确同意的情况下这样做......所以我想通过要求将其声明为静态来强制明确同意.

Bar*_*nau 8

假设匿名联合不需要被声明为静态,并且编译器遇到这两个翻译单元(在预处理之后):

文件1:

union {
  int  a;
  char b;
};

// Further contents referring to a and b
Run Code Online (Sandbox Code Playgroud)

文件2:

union {
  int  a;
  char b;
};

// Further (different) contents referring to a and b
Run Code Online (Sandbox Code Playgroud)

这两个联合是同一个对象,还是应该是不同的对象?

我认为,为了避免像这样无法回答的问题,已经决定必须将命名空间范围的匿名联合声明为静态。


lot*_*har 2

我的猜测是,如果允许以非静态方式定义联合,它可能会违反 ODR (一个定义规则)