我可以检查初始化列表中设置的构造函数主体中的变量吗



在初始化列表的情况下,我怀疑构造函数的主体是如何工作的。如果构造函数传递的值不是允许的值,并且需要抛出异常,那么这样做正确吗?

Foo(int a_) : a(a_) {
if (a>0)
throw std::invalid_argument("positive value!");
};

在更复杂的情况下,我对如何评估这一点表示怀疑。

根据cppreference,假设初始值设定项列表将在构造函数的"body"执行之前完成是绝对安全的(第4项的粗体是我的(:

列表中成员初始值设定项的顺序无关紧要:实际初始化顺序如下

  • 1如果构造函数用于派生最多的类,则虚拟基类将按照它们在基类声明的深度优先从左到右遍历(从左到右指出现在基说明符列表中(
  • 2然后,直接基类按照从左到右的顺序初始化,因为它们出现在该类的基类说明符列表中
  • 3然后,按照类定义中声明的顺序初始化非静态数据成员
  • 4最后,构造函数的主体被执行

现在,尽管cppreference不是实际的标准,但它通常在此类问题上是准确的。

编辑:C++14(§12.6.2(标准草案(PDF的第283-284页(确认了cppreference的规定(是的,我知道OP指定的C++11,但我无法在线获取该标准的链接,我非常怀疑该标准是否在11、14和17之间发生了变化!(

最新更新