A matriz de caracteres encapsulados usada como objeto quebra a regra de alias restrita

Faça a seguinte classe quebrar a regra de aliasing estrita:

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;
        }
    }
}

Minha leitura de um padrão é que é incorreto, mas não tenho certeza (meu uso é ter uma matriz de objetosT + alguns metadados desses objetos, mas para ter controle sobre a construção / desconstrução do objeto sem alocar memória manualmente), pois os objetos alocados são usados ​​como exemplos para posicionamentonew no padrão.

questionAnswers(2)

yourAnswerToTheQuestion