Gibt die C ++ - Spezifikation die Reihenfolge operator new
und den Konstruktor von A
in an new C(A())
?
Das g ++ ließ die Reihenfolge sein A()
-> new
-> C()
, aber clang ++ ließ es sein new
->A()
-> C()
.
Wird der Unterschied durch nicht angegebenes Verhalten verursacht?
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
quelle
quelle
Antworten:
Clang ist richtig. Seit C ++ 17 ist die Ausführungsreihenfolge garantiert. [expr.new] / 19
operator new
(die Zuordnungsfunktion) soll zuerst aufgerufen werden, dann die Auswertung des Ausdrucks im New-Initialisierer (dhA()
).Vor C ++ 17 kann die Reihenfolge nicht garantiert werden. [expr.new] / 18 (C ++ 14)
Es scheint, dass gcc nicht mit C ++ 17 (und höher) übereinstimmt. Das Kompilieren mit gcc10 im C ++ 2a-Modus ergibt das gleiche Ergebnis.
quelle