Ответ 1
Ваша попытка ничем не отличается от этой явно неработоспособной (где IsLittleEndian()
идентично true
):
constexpr char c[sizeof(int)] = {1};
constexpr int i = {1};
constexpr bool IsLittleEndian ()
{
return i == c[0]; // ignore different type comparison
}
static_assert(IsLittleEndian(), "The machine is BIG endian");
Я считаю, что С++ 11 не предоставляет средств для программного определения конечности целевой платформы во время компиляции. Мой аргумент состоит в том, что единственным действительным способом выполнения проверки во время выполнения является проверка переменной int
с помощью указателя unsigned char
(так как другие способы персонализации типов неизбежно содержат поведение undefined):
const uint32_t i = 0xffff0000;
bool isLittleEndian() {
return 0 == *reinterpret_cast<const unsigned char*>(&i);
}
С++ 11 не позволяет выполнить эту функцию constexpr
, поэтому эта проверка не может быть выполнена во время компиляции.