constexpr中的字节序

Ric*_*ter 14 c++ endianness language-lawyer constant-expression

我想创建一个constexpr函数来返回系统的字节序,如下所示:

constexpr bool IsBigEndian()
{
    constexpr int32_t one = 1;
    return (reinterpret_cast<const int8_t&>(one) == 0);
}
Run Code Online (Sandbox Code Playgroud)

现在,由于函数将在编译时而不是在实际的目标机器上执行,C++规范给出了什么保证以确保返回正确的结果?

Bar*_*rry 9

没有.事实上,该计划是不正确的.来自[expr.const]:

条件表达式e是核心常量表达式,除非按照抽象机器(1.9)的规则评估e将评估以下表达式之一:
- [...]
- a reinterpret_cast.
- [...]

并且,来自[dcl.constexpr]:

对于既不是默认也不是模板的constexpr函数或constexpr构造函数,如果不存在参数值,则函数或构造函数的调用可以是核心常量表达式的评估子表达式(5.20),或者对于构造函数,可以是常量初始化函数对于某些对象(3.6.2),该程序是不正确的; 无需诊断.


这样做的方法是希望你的编译器足够好,可以为你的机器的字节序提供宏.例如,在gcc上,我可以使用__BYTE_ORDER__:

constexpr bool IsBigEndian() {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    return false;
#else
    return true;
#endif
}
Run Code Online (Sandbox Code Playgroud)

  • @uhohsomebodyneedsapupper违反严格别名是UB.不能作为const表达式求值的`constexpr`函数是不正确的. (3认同)
  • @uhohsomebodyneedsapupper没有必要的违规行为.int8_t可能是char,允许通过char*进行别名. (3认同)