Поиск конечного результата программно во время компиляции с использованием С++ 11

Я задал много вопросов в SO по этой теме, но пока не нашел никакого решения. Одно естественное решение было упомянуто здесь: Определение достоверности во время компиляции.
Тем не менее, связанные проблемы, упомянутые в комментариях и тот же ответ.

С некоторыми изменениями я могу скомпилировать аналогичное решение с g++ и clang++ (-std=c++11) без предупреждения.

static_assert(sizeof(char) == 1, "sizeof(char) != 1");
union U1
{
  int i;
  char c[sizeof(int)];
};  
union U2
{ 
  char c[sizeof(int)];
  int i;
};  

constexpr U1 u1 = {1};
constexpr U2 u2 = {{1}};
constexpr bool IsLittleEndian ()
{ 
  return u1.i == u2.c[0];  // ignore different type comparison
}   

static_assert(IsLittleEndian(), "The machine is BIG endian");

Демо.

Можно ли считать это детерминированным методом для решения вопроса о контенте или же он пропустит пин-код или что-то еще?

Ответы

Ответ 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, поэтому эта проверка не может быть выполнена во время компиляции.