在 new 表达式中分配内存后是否评估初始值设定项?
Is initializer evaluated after memory allocation in new expression?
考虑代码
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:
The invocation of the allocation function is sequenced before the evaluations of expressions in the new-initializer.
Initialization of the allocated object is sequenced before the value computation of the new-expression.
考虑代码
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:
The invocation of the allocation function is sequenced before the evaluations of expressions in the new-initializer. Initialization of the allocated object is sequenced before the value computation of the new-expression.