¿Es legal eludir el constructor de una clase o resulta en un comportamiento indefinido?

Considere el siguiente código de muestra:

class C
{
public:
    int* x;
};

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

Si tuviera que vivir con la memoria no inicializada por alguna razón (por supuesto, si es posible, llamaríanew C()&nbsp;en cambio), todavíapodría&nbsp;llame al constructor de colocación. Pero si omito esto, como arriba, e inicializocada&nbsp;variable de miembro manualmente, ¿da como resultado un comportamiento indefinido? Es decir. está eludiendo el comportamiento indefinido del constructor per se o es legal reemplazarlo llamando con algún código equivalente fuera de la clase?

(Encontré esto a través de otra pregunta sobre un asunto completamente diferente; pidiendo curiosidad ...)