根据C++标准中的12.3.1点:
如果一个标准布局联合包含多个共享公共初始序列的标准布局结构体,并且如果该标准布局联合类型的对象的非静态数据成员是活动状态且是其中一个标准布局结构,则允许检查任何标准布局结构成员的公共初始序列;
然而,以下代码在任何主要编译器上都不能被编译(https://godbolt.org/z/3jM1co):
struct type {
union {
int a;
int b;
};
constexpr type(int n) : a(n) {}
};
constexpr int fun(int n) {
type t(n);
return t.b;
}
constexpr int res = fun(5);
为什么代码编译不通过(我相信所有编译器都不会错)?这段代码应该满足访问联合体中的技术非活动成员的条件(标准布局,公共初始序列)。当删除 constexpr
关键字时,这段代码就可以顺利编译。
a
和b
转换为结构体。移除constexpr
后,代码具有未定义行为。 - Richard Critten