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

时间:2016-06-04 13:50:56

标签: c++ language-lawyer

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

  

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

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

  • 所有的成员具有const限定条件(与相反情况相比,其中至少有一个成员不符合const条件)以及从何种角度来看,这是多么特别它与默认的默认构造函数有很大关系吗?

1 个答案:

答案 0 :(得分:4)

假设你有一个只有const成员的联合:

union Foo {
    const int x;
    const double y;
}

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

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

union Bar {
    int x;
    const double y;
    Bar() : y(10.0) {}
}

默认构造函数可能有意义,因为您以后仍可以通过

更改活动成员
Bar b;
b.x = 10;