我的印象是以下容易泄漏
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{}} {};
};
如果评估顺序如下
new A{}
new int{3}
new C{}
a{}
b{}
c{}
我正在研究新的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 ++)
答案 0 :(得分:5)
不,不允许该命令;语言并不疯狂。
这些是完全不同的完整表达式,因此它由[intro.execution]/16控制:
与a相关的每个值计算和副作用 full-expression在每个值计算和side之前排序 与要评估的下一个完整表达相关联的效果。
答案 1 :(得分:1)
每个成员初始化都被视为一个单独的陈述,并严格定义这些陈述之间的顺序。
因此,在您的示例中,订单将定义为: