为什么C ++需要用户提供的默认构造函数来默认构造const对象?

C ++标准(第8.5节)说:


如果程序要求对const限定类型T的对象进行默认初始化,则T必须是具有用户提供的默认构造函数的类类型。


为什么?我想不出在这种情况下为什么需要用户提供的构造函数的任何原因。


struct B{

  B():x(42){}

  int doSomeStuff() const{return x;}

  int x;

};


struct A{

  A(){}//other than "because the standard says so", why is this line required?


  B b;//not required for this example, just to illustrate

      //how this situation isn't totally useless

};


int main(){

  const A a;

}


幕布斯6054654
浏览 542回答 3
3回答

aluckdog

我纯粹是猜测,但请考虑其他类型也有类似的限制:int main(){    const int i; // invalid}因此,此规则不仅是一致的,而且(递归地)可以防止统一的const(子)对象:struct X {    int j;};struct A {    int i;    X x;}int main(){    const A a; // a.i and a.x.j in unitialized states!}至于问题的另一面(允许使用默认构造函数的类型),我认为这样的想法是,具有用户提供的默认构造函数的类型在构造后应始终处于某种合理的状态。请注意,这些规则适用于以下情况:struct A {    explicit    A(int i): initialized(true), i(i) {} // valued constructor    A(): initialized(false) {}    bool initialized;    int i;};const A a; // class invariant set up for the object           // yet we didn't pay the cost of initializing a.i然后,也许我们可以制定一条规则,例如“必须在用户提供的默认构造函数中明智地初始化至少一个成员”,但这花了太多时间来防范Murphy。C ++在某些方面倾向于信任程序员。
打开App,查看更多内容
随时随地看视频慕课网APP