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 ...)