C++ C++;标准:为什么有些;订单“;定义了,有些没有? 有了一个类,其成员的初始化顺序在构造函数中得到了严格定义(可能是为了允许成员之间的依赖关系,就像这样-但我认为这更像是一个设计问题,我可以想象循环依赖关系) 有一个函数调用,参数求值的顺序没有定义,我认为这是为了C兼容性
对于以下“可怕的钻石”问题,我们有一个错误: 编译器不知道选择哪个版本,顺序被定义为不明确。为什么不使用本文中定义的“从左到右深度优先分辨率顺序”(答案不可信),即选择B而不是CC++ C++;标准:为什么有些;订单“;定义了,有些没有? 有了一个类,其成员的初始化顺序在构造函数中得到了严格定义(可能是为了允许成员之间的依赖关系,就像这样-但我认为这更像是一个设计问题,我可以想象循环依赖关系) 有一个函数调用,参数求值的顺序没有定义,我认为这是为了C兼容性,c++,standards,diamond-problem,initialization-order,C++,Standards,Diamond Problem,Initialization Order,对于以下“可怕的钻石”问题,我们有一个错误: 编译器不知道选择哪个版本,顺序被定义为不明确。为什么不使用本文中定义的“从左到右深度优先分辨率顺序”(答案不可信),即选择B而不是C 那么为什么会有这些不同的方法呢?为什么有严格的1号订单而不是3号订单?不定义1不是更简单吗?或者2简单地定义为左向右?这是非常不同的情况,有各种不同的权衡。在每种情况下,你都必须考虑 这些情况多久发生一次 任意选择产生意外后果的可能性有多大 明确指定何时需要特定订单有多容易 强制执行特定订单会导致哪些性能损失 这些
那么为什么会有这些不同的方法呢?为什么有严格的1号订单而不是3号订单?不定义1不是更简单吗?或者2简单地定义为左向右?这是非常不同的情况,有各种不同的权衡。在每种情况下,你都必须考虑
- 这些情况多久发生一次
- 任意选择产生意外后果的可能性有多大
- 明确指定何时需要特定订单有多容易
- 强制执行特定订单会导致哪些性能损失
这些问题的答案在每种情况下都有很大的不同,因此有不同的选择是很自然的。试图从不同的基础访问同名成员的问题被定义为模棱两可。这与执行函数定义的评价顺序有很大的不同。C++中有很多东西被定义为模糊的,以避免错误。好的,未指定的参数评估顺序打开了一些优化机会。“沃恩CATO”定义为“含糊”不是一个“定义的顺序”。为什么初始化顺序没有(很好地)定义为不明确的(以避免错误…尤其是在测试中)?如果成员的初始化顺序不明确,那么就不可能初始化任何东西。这可能是不确定的,但这会使某些事情变得更加困难。对不起,这是哲学。我相信决定这些事情的人(80年代只有斯特劳斯特鲁普一人?)有更简单的理由来做他们所做的事情,他们没有表现、发生频率等问题的含义。这没什么大不了的,但对我来说,在这三种情况中最“自然”的是从左到右的顺序。。。除了阿拉伯人和犹太人。(构造函数的初始化顺序是从左到右)@Liviu:你错了。这是一个极好的、准确的答案。
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 {};