考虑代码
auto p = new T( U(std::move(v)) );
然后,初始化器为 U(std::move(v))
。假设T( U(std::move(v)) )
不会投掷。如果在基础内存分配后评估了初始化器,则代码将是强大的安全性。否则,不是。如果抛出内存分配,v
将已经移动。因此,我对内存分配和初始化器评估之间的相对顺序感兴趣。它是定义的,未指定的还是什么?
是的,在分配后评估初始化。引用C 17(N4659([expr.new] 8.3.4/19:
在 new-initializer 中评估表达式之前,对分配函数的调用进行了测序。 在 new> new-expression 。
的值计算之前对分配对象的初始化进行了测序