После некоторого поиска способа проверки endianess во время компиляции я придумал следующее решение:
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 верен?