7

考虑代码

auto p = new T( U(std::move(v)) );

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

4

1 回答 1

8

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

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

于 2018-04-04T08:36:41.517 回答