C ++标准:为什么定义了一些“订单”而一些没有?

时间:2014-01-04 02:39:50

标签: c++ standards diamond-problem initialization-order

  1. 有一个类,它的成员的初始化顺序在构造函数中被强烈定义(可能允许成员之间的依赖关系,就像在这个question - 但我认为这更像是一个设计问题,我可以想象循环依赖)。
  2. 进行函数调用后,参数评估的顺序没有定义,我认为是C兼容性。
  3. 我们对以下“可怕的钻石”问题有误:

    struct A {virtual void Print() {}};
    struct B: virtual public A {virtual void Print() {}};
    struct C: virtual public A {virtual void Print() {}};
    struct D: public B, public C {};
    

    编译器不知道选择哪个版本,订单被定义为不明确。为什么不使用此question中定义的“从左到右的深度优先解析顺序”(带有难以理解的答案),即选择B而不是C?

  4. 那么为什么这些不同的方法呢?为什么有一个严格的订单1而不是3?保持1未定义是不是更简单?或者2简单地定义为从左到右?

1 个答案:

答案 0 :(得分:1)

这些是非常不同的情况,需要进行各种权衡。在每种情况下,您都必须考虑

  • 这些情况多久发生一次?
  • 任意选择产生意外后果的可能性有多大?
  • 明确指定何时需要特定订单是多么容易?
  • 强制执行特定订单会导致什么性能下降?

这些问题的答案在每种情况下都有很大差异,因此选择不同是很自然的。