Czy enkapsulowana tablica char używana jako obiekt łamie surową regułę aliasingu

Czy poniższa klasa łamie surową regułę aliasingu:

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

Moje czytanie standardu jest takie, że jest niepoprawny, ale nie jestem pewien (moje użycie ma tablicę obiektówT + niektóre metadane tych obiektów, ale aby mieć kontrolę nad budową / dekonstrukcją obiektu bez ręcznego przydzielania pamięci), ponieważ przydzielone obiekty są używane jako przykłady umieszczenianew w standardzie.

questionAnswers(2)

yourAnswerToTheQuestion