У меня есть класс шаблона с bool в качестве параметра шаблона Dynamic<bool>
. Независимо от того, является ли параметр истинным или ложным, он имеет точно такие же элементы данных. они просто отличаются своими функциями-членами.
Есть одна ситуация, когда мне нужно временно преобразовать одно в другое вместо использования конструктора копирования/перемещения. Поэтому я прибег к каламбуру. Чтобы убедиться, что это вызывает проблему, я использовал два static_asserts
:
d_true=Dynamic<true>(...);
...
static_assert(sizeof(Dynamic<true>)==sizeof(Dynamic<false>),"Dynamic size mismatch");
static_assert(alignof(Dynamic<true>)==alignof(Dynamic<false>),"Dynamic align mismatch");
Dynamic<false>& d_false=*reinterpret_cast<Dynamic<false>*>(&d_true);
...
Поэтому я думаю, что то, что я делаю, безопасно, и если что-то пойдет не так, компилятор выдаст мне ошибку static_assert
. Однако gcc выдает предупреждение:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
Мой вопрос двоякий: то, что я делаю, лучший способ добиться этого? Если это так, как убедить gcc, что это безопасно, и избавиться от предупреждения?