A especificação C ++ especifica a ordem operator new
e o construtor de A
in new C(A())
.
O g ++ deixou a ordem como A()
-> new
-> C()
, mas o clang ++ deixou new
- A()
- - -> C()
.
A diferença é causada por comportamento não especificado?
g ++: 7.4.0 cl +++: 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
fonte
fonte
Respostas:
Clang está correto. Desde C ++ 17, a ordem de execução é garantida. [expr.new] / 19
operator new
(a função de alocação) deve ser chamada primeiro, depois a avaliação da expressão no novo inicializador (ieA()
).Antes do C ++ 17, o pedido não era garantido. [expr.new] / 18 (C ++ 14)
Parece que o gcc não está em conformidade com o C ++ 17 (e posterior); compilar com o gcc10 no modo C ++ 2a fornece o mesmo resultado.
fonte