【发布时间】:2020-09-28 07:55:38
【问题描述】:
第 12.3.1 点中的 C++ 标准说:
如果标准布局联合包含多个共享公共初始序列的标准布局结构,并且此标准布局联合类型的对象的非静态数据成员处于活动状态并且是标准布局之一结构,允许检查任何标准布局结构成员的公共初始序列;
但以下代码无法在任何主要编译器上编译 (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后,代码具有未定义的行为。 -
没关系。当用 struct 包装
a和b时,会出现同样的错误。
标签: c++ language-lawyer constexpr unions