考虑代码
auto p = new T( U(std::move(v)) );
然后初始化程序为U(std::move(v))
。我们假设T( U(std::move(v)) )
没有投掷。如果在底层内存分配之后评估初始化程序,则代码是强异常安全的。否则,事实并非如此。如果抛出内存分配,v
就已经被移动了。因此,我对内存分配和初始化程序评估之间的相对顺序感兴趣。它是定义的,未指定的,还是什么?
答案 0 :(得分:8)
是的,在分配后评估初始化。引用C ++ 17(N4659)[expr.new] 8.3.4 / 19:
在评估 new-initializer 中的表达式之前,对分配函数的调用进行了排序。 在计算 new-expression 的值之前,对已分配对象的初始化进行排序。