After the object is constructed by placement-new, the class methods still needs to reinterpret_cast the char array to an object pointer to access the object.
I don't think in this specific case there is an UB involved, but I'm not language standard lawyer so I'm not sure. I feel the standard's specification on what is allowed to reinterpret_cast and what isn't is arcane (or at least far from straightforward to understand).