Contornar o construtor de uma classe é legal ou resulta em comportamento indefinido?

Considere o seguinte código de exemplo:

class C
{
public:
    int* x;
};

void f()
{
    C* c = static_cast<C*>(malloc(sizeof(C)));
    c->x = nullptr; // <-- here
}

Se eu tivesse que viver com a memória não inicializada por qualquer motivo (é claro, se possível, eu chamarianew C() em vez disso), eu aindapoderia chame o construtor de canais. Mas se eu omitir isso, como acima, e inicializarcada variável de membro manualmente, isso resulta em um comportamento indefinido? I.e. está contornando o construtor por si só um comportamento indefinido ou é legal substituir a chamada por algum código equivalente fora da classe?

(Me deparei com isso por meio de outra pergunta sobre um assunto completamente diferente; pedindo curiosidade ...)

questionAnswers(6)

yourAnswerToTheQuestion