Порядок выполнения оператора new и аргумента конструктора - PullRequest
9 голосов
/ 23 декабря 2019

Указывает ли спецификация C ++ порядок operator new и конструктор A в new C(A()).
G ++ допускает порядок A() -> new -> C(), но clang ++ letэто будет 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());
}
...