0
  1. 拥有一个类,其成员的初始化顺序在构造函数中被强烈定义(可能允许成员之间的依赖关系,就像在这个问题中一样- 但我认为这更多是一个设计问题,我可以想象循环依赖关系)。
  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 {};
    

    编译器不知道选择哪个版本,顺序被定义为不明确的。为什么根本不使用此问题中定义的“从左到右的深度优先分辨率顺序” (答案令人信服),即选择 B 而不是 C?

那么为什么会有这些不同的方法呢?为什么对 1 有严格的顺序而不对 3 有严格的顺序?保持 1 未定义不是更简单吗?还是 2 简单地定义为从左到右?

4

1 回答 1

1

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

  • 这些情况多久发生一次?
  • 任意选择产生意想不到的后果的可能性有多大?
  • 明确指定何时需要特定订单有多容易?
  • 强制执行特定订单会导致哪些性能损失?

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

于 2014-01-05T14:38:25.680 回答