¿La matriz de caracteres encapsulada utilizada como objeto rompe una regla de alias estricta?

¿La siguiente clase rompe la regla estricta de aliasing?

template<typename T>
class store {
    char m_data[sizeof(T)];
    bool m_init;
public:
    store() : m_init(false) {}
    store(const T &t) : init(true) {
        new(m_data) T(t);
    }
    ~store() {
        if(m_init) {
            get()->~T();
        }
    }
    store &operator=(const store &s) {
        if(m_init) {
            get()->~T();
        }
        if(s.m_init) {
            new(m_data) T(*s.get());
        }
        m_init = s.m_init;
    }
    T *get() {
        if (m_init) {
            return reinterpret_cast<T *>(m_data);
        } else {
            return NULL;
        }
    }
}

Mi lectura de un estándar es que es incorrecta pero no estoy segura (mi uso es tener una variedad de objetosT + algunos metadatos de esos objetos pero para tener control sobre la construcción / deconstrucción del objeto sin asignar memoria manualmente) ya que los objetos asignados se usan como ejemplos para la colocaciónnew en la norma

Respuestas a la pregunta(2)

Su respuesta a la pregunta