未命名命名空间中的非静态未命名联合

Vai*_*Man 9 c++ language-lawyer

gcc 和 msvc 无法编译这段代码,并出现错误 msg namespace-scope anonymous aggregates must be static。但是 clang 编译这个没有问题。 https://godbolt.org/z/WecT6vP91

namespace {
    union {
        int a;
        long b;
    };
}
Run Code Online (Sandbox Code Playgroud)

https://en.cppreference.com/w/cpp/language/union

命名空间范围的匿名联合必须声明为静态,除非它们出现在未命名的命名空间中

这似乎是 gcc 和 msvc 的错误?


编辑:

但是,Clang 拒绝在嵌套在未命名命名空间中的命名空间中编译非静态匿名联合。是否可以将规则更改为“...除非它们出现在直接或间接的未命名命名空间中”(这似乎还有另一个问题,见下文)或“...除非它们具有内部链接”?或者为什么不能?

namespace {
  namespace ns {
    union {
      int a;
      long b;
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

根据未命名命名空间内的名称的外部链接,未命名命名空间中的名称可以具有C语言链接。Clang 甚至接受具有 C 语言链接的非静态匿名联合,但实际上没有生成链接符号,这似乎没有意义。标准允许吗?如果允许,extern "C"内部直接或间接无名命名空间有什么影响?

namespace {
  extern "C" union {
    int a;
    long b;
  };
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ing 0

GCC 和 MSVC 刚刚\xe2\x80\x99 尚未完成P1787R6 的实现;以前,规则实际上说static无论如何都是必需的,并且 Cppreference 是错误的(!)。

\n