构造函数中初始化列表的评估顺序是否已修复?

时间:2017-07-08 17:21:42

标签: c++ language-lawyer c++17 operator-precedence

我的印象是以下容易泄漏

class Something {
    std::unique_ptr<A> a;
    std::unique_ptr<int> b{new int{3}};
    std::unique_ptr<C> c;
public:
    Something() : a{new A{}}, c{new C{}} {};
};

如果评估顺序如下

  1. new A{}
  2. new int{3}
  3. new C{}
  4. a{}
  5. b{}
  6. c{}
  7. 我正在研究新的C ++ 17特性(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf),该特性修复了以前版本的C ++中评估错误的顺序,但它似乎只讨论了函数参数评估。

    我看了一下评估顺序(http://en.cppreference.com/w/cpp/language/eval_order)的cppreference文档,它似乎也没有提到这一点。

    以上是否有明确的评估顺序? (现在使用C ++ 17或以前版本的C ++)

2 个答案:

答案 0 :(得分:5)

不,不允许该命令;语言并不疯狂。

这些是完全不同的完整表达式,因此它由[intro.execution]/16控制:

  

与a相关的每个值计算和副作用   full-expression在每个值计算和side之前排序   与要评估的下一个完整表达相关联的效果。

答案 1 :(得分:1)

每个成员初始化都被视为一个单独的陈述,并严格定义这些陈述之间的顺序。

因此,在您的示例中,订单将定义为:

  1. new A {}
  2. 一个{}
  3. new int {3}
  4. B {}
  5. new C {}
  6. C {1}