Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;标准:为什么有些;订单“;定义了,有些没有? 有了一个类,其成员的初始化顺序在构造函数中得到了严格定义(可能是为了允许成员之间的依赖关系,就像这样-但我认为这更像是一个设计问题,我可以想象循环依赖关系) 有一个函数调用,参数求值的顺序没有定义,我认为这是为了C兼容性_C++_Standards_Diamond Problem_Initialization Order - Fatal编程技术网

C++ C++;标准:为什么有些;订单“;定义了,有些没有? 有了一个类,其成员的初始化顺序在构造函数中得到了严格定义(可能是为了允许成员之间的依赖关系,就像这样-但我认为这更像是一个设计问题,我可以想象循环依赖关系) 有一个函数调用,参数求值的顺序没有定义,我认为这是为了C兼容性

C++ C++;标准:为什么有些;订单“;定义了,有些没有? 有了一个类,其成员的初始化顺序在构造函数中得到了严格定义(可能是为了允许成员之间的依赖关系,就像这样-但我认为这更像是一个设计问题,我可以想象循环依赖关系) 有一个函数调用,参数求值的顺序没有定义,我认为这是为了C兼容性,c++,standards,diamond-problem,initialization-order,C++,Standards,Diamond Problem,Initialization Order,对于以下“可怕的钻石”问题,我们有一个错误: 编译器不知道选择哪个版本,顺序被定义为不明确。为什么不使用本文中定义的“从左到右深度优先分辨率顺序”(答案不可信),即选择B而不是C 那么为什么会有这些不同的方法呢?为什么有严格的1号订单而不是3号订单?不定义1不是更简单吗?或者2简单地定义为左向右?这是非常不同的情况,有各种不同的权衡。在每种情况下,你都必须考虑 这些情况多久发生一次 任意选择产生意外后果的可能性有多大 明确指定何时需要特定订单有多容易 强制执行特定订单会导致哪些性能损失 这些

对于以下“可怕的钻石”问题,我们有一个错误:

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


那么为什么会有这些不同的方法呢?为什么有严格的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 {};