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)