为什么由const限定变体成员组成的联合导致没有默认的默认构造函数?

b1s*_*sub 5 c++ language-lawyer

N4567的标准草案表明,如果根据12.1第4段,默认的默认构造函数被定义为已删除:

X是一个联合,它的所有变体成员都是const限定类型(或其数组),

换句话说,它等同于说,如果其变体成员之一不是const限定的,则上述规则不适用.我的问题是:

  • 所有成员const限定(与相反的情况相比,其中至少有一个不是const限定的),以及在什么角度它与默认的默认构造函数密切相关?

for*_*818 4

假设您有一个仅包含 const 成员的联合:

union Foo {
    const int x;
    const double y;
}
Run Code Online (Sandbox Code Playgroud)

默认构造函数必须决定初始化哪些成员并成为活动成员。一旦创建,您就无法更改任何成员的值(它们都是常量),因此您也无法更改哪个是活动成员。因此,这样的构造作为联合是相当无用的。

另一方面,如果一个成员不是 const:

union Bar {
    int x;
    const double y;
    Bar() : y(10.0) {}
}
Run Code Online (Sandbox Code Playgroud)

默认构造函数可能是有意义的,因为您以后仍然可以通过以下方式更改活动成员

Bar b;
b.x = 10;
Run Code Online (Sandbox Code Playgroud)