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++规范给出了什么保证以确保返回正确的结果?
没有.事实上,该计划是不正确的.来自[expr.const]:
条件表达式e是核心常量表达式,除非按照抽象机器(1.9)的规则评估e将评估以下表达式之一:
- [...]
- areinterpret_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)
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |