¿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