¿La especificación de C ++ especifica el orden operator new
y el constructor de A
in new C(A())
.
El g ++ deja que el orden sea A()
-> new
-> C()
, pero clang ++ deja que sea new
-> A()
-> C()
.
¿Es la diferencia causada por un comportamiento no especificado?
g ++: 7.4.0 clang ++: 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());
}
c++
language-lawyer
c++17
order-of-execution
eddie kuo
fuente
fuente
Respuestas:
Clang es correcto. Desde C ++ 17 el orden de ejecución está garantizado. [expr.new] / 19
operator new
(la función de asignación) se supone que se invoca primero, luego la evaluación de la expresión en el nuevo inicializador (es decirA()
).Antes de C ++ 17, el pedido no está garantizado. [expr.nuevo] / 18 (C ++ 14)
Parece que gcc no se ajusta a C ++ 17 (y posterior); compilar con gcc10 en modo C ++ 2a da el mismo resultado.
fuente