Apakah spesifikasi C ++ menentukan urutan operator new
dan konstruktor A
dalam new C(A())
.
G ++ membiarkan urutannya menjadi A()
-> new
-> C()
, tetapi clang ++ biarkan saja new
-> A()
-> C()
.
Apakah perbedaan disebabkan oleh perilaku yang tidak ditentukan?
g ++: 7.4.0 dentang ++: 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
sumber
sumber
Jawaban:
Dentang benar. Sejak C ++ 17 perintah eksekusi dijamin. [expr.new] / 19
operator new
(fungsi alokasi) seharusnya dipanggil terlebih dahulu, kemudian evaluasi ekspresi di-inisialisasi baru (yaituA()
).Sebelum C ++ 17, pesanan tidak dijamin. [expr.new] / 18 (C ++ 14)
Tampaknya gcc tidak sesuai dengan C ++ 17 (dan yang lebih baru); kompilasi dengan gcc10 dalam mode C ++ 2a memberikan hasil yang sama.
sumber