После некоторых поисков способа проверки порядка байтов во время компиляции я пришел к следующему решению:
static const int a{1};
constexpr bool is_big_endian()
{
return *((char*)&(a)) == 1;
}
GCC принимает этот код только в некоторых контекстах, где требуется constexpr:
int b[is_big_endian() ? 12 : 25]; //works
std::array<int, testendian() ? 12 : 25> c; //fails
Для во втором случае GCC сообщает об ошибке : доступ к значению 'a' через glvalue 'char' в константном выражении
. Я не нашел в стандарте ничего, что запрещало бы такое. Может быть, кто-нибудь сможет уточнить, в каком случае GCC правильный?