运算符 new 的执行顺序和构造函数的参数



C++规范是否指定了new C(A())A的顺序operator new和构造函数。
g++ 允许顺序A()->new->C(),但 clang++ 让它new->A()->C()
差异是由未指定的行为引起的吗?

g++ :7.4.0 叮叮当当++:10.0.0

#include <iostream>
#include <cstdlib>
struct A {
A() {
std::cout << "call A()n";
}
};
struct C {
C(A) {
std::cout << "call S()n";
}
void *operator new(size_t s) {
std::cout << "call new()n";
return malloc(s);
}
};
int main() {
void *p = new C(A());
}

Clang 是正确的。自C++17起,执行顺序得到保证。[新]/19

分配函数的调用在new-initializer中的表达式计算之前排序。

operator new(分配函数(应该首先被调用,然后在new-initializer中对表达式的求值(即A()(。

在C++17之前,订单不保证。[前新]/18 (C++14(

分配函数的调用相对于new-initializer中表达式的计算是不确定的。


似乎 gcc 不符合 C++17(及更高版本(;在 C++2a 模式下使用 gcc10 编译会给出相同的结果。

最新更新