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;}
3 回答
aluckdog
TA贡献1847条经验 获得超7个赞
我纯粹是猜测,但请考虑其他类型也有类似的限制:
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 ++在某些方面倾向于信任程序员。
- 3 回答
- 0 关注
- 541 浏览
添加回答
举报
0/150
提交
取消