Спецификация C ++ определяет порядок operator new
и конструктор A
в new C(A())
.
G ++ пусть порядок будет A()
-> new
-> C()
, но clang ++ пусть это будет new
-> A()
-> C()
.
Разница вызвана неопределенным поведением?
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
Эдди Куо
источник
источник
Ответы:
Clang это правильно. Начиная с C ++ 17 порядок выполнения гарантирован. [expr.new] / 19
operator new
(функция распределения) должна вызываться сначала, а затем вычислять выражение в новом инициализаторе (т.е.A()
).До C ++ 17 порядок не гарантирован. [expr.new] / 18 (C ++ 14)
Кажется, что gcc не соответствует C ++ 17 (и позже); компиляция с gcc10 в режиме C ++ 2a дает тот же результат.
источник