Wpis z mikrobloga

Clang ma rację, a GCC generuje Ci funkcje, które nie są constexpr. Po prostu źle zrozumiałeś standard:

A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions (...) a reinterpretcast.


Czyli wyrażenie jest constexpr, chyba że zawiera reinterpretcasta (lub jeden z kilku innych konstruktów).

Twoje funkcje set_a, set_b, ... zawierają reinterpret
@virgoerns: Masz rację, dziękuję :)
Zmieniłem na zwykłe inty + unia, teraz tylko zakładam, że te pola będą poprawnie wyalignowane (wyrównane?). Chyba każdy kompilator zrobi to tak jak chcę, bo w standardzie chyba nie jest zdefiniowane, jak konkretne pola w strukturze muszą być wyalignowane, mylę się?
Btw. Clang sprawdza kod dokładniej, kompiluje 2x szybciej i mój program działa szybciej o ~15% niż ten skompilowany w GCC, chyba czas się przerzucić :)
@patste: Nie, unia w C++ nie służy do castowania między typami unii. To jest poprawne w C, ale na mocy [class.union] jest niepoprawne w C++ (chociaż pewnie zadziała w większości kompilatorów):

In a union, at most one of the non-static data members can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time.


Dlaczego