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

Cur*_*ous 0 c++ operator-precedence language-lawyer c++17

我的印象是以下容易发生泄漏

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{}} {};
};
Run Code Online (Sandbox Code Playgroud)

如果评估顺序如下

  1. new A{}
  2. new int{3}
  3. new C{}
  4. a{}
  5. b{}
  6. c{}

我正在查看新的C++ 17功能(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf),该功能修复了之前评估错误的顺序C++的版本,但它似乎只谈论函数参数评估.

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

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

T.C*_*.C. 5

不,那个订单是不允许的; 语言并不那么疯狂.

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

在与要评估的下一个全表达式相关联的每个值计算和副作用之前,对与全表达式相关联的每个值计算和副作用进行排序.