После некоторого поиска способа проверки порядка байтов во время компиляции я нашел следующее решение:
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 говорит error: accessing value of ‘a’ through a ‘char’ glvalue in a constant expression
.Я не мог найти ничего в стандарте, который запрещает такие вещи.Может быть, кто-то может уточнить, в каком случае GCC является правильным?