在新表达式中进行内存分配后是否对初始化程序进

Lin*_*gxi 7 c++ exception new-operator dynamic-memory-allocation object-initialization

考虑一下代码

auto p = new T( U(std::move(v)) );
Run Code Online (Sandbox Code Playgroud)

然后是初始化器U(std::move(v)).让我们假设T( U(std::move(v)) )不抛出.如果在底层内存分配之后评估初始化程序,则代码是强异常安全的.否则,事实并非如此.如果抛出内存分配,v就已经被移动了.因此,我对内存分配和初始化程序评估之间的相对顺序感兴趣.它是定义的,未指定的,还是什么?

Rei*_*ica 8

是的,在分配后评估初始化.引用C++ 17(N4659)[expr.new] 8.3.4/19:

在对new-initializer中的表达式求值之前,对分配函数的调用进行排序.在new-expression的值计算之前对分配的对象的初始化进行排序.