例如,我想知道在小端序平台上编译的evaluated是否会在大端序目标平台上返回true。
constexpr bool is_little_endian()
{
int num = 1;
return (1 == *(char *)&num);
}
换句话说,constexpr的计算是否像在目标上一样?
编辑:这个例子不正确,但问题仍然存在。
首先:如果为给定目标编译代码,那么编译器将为目标生成代码。当然,这包括在编译时计算的表达式——否则,涉及此类表达式的每一次交叉编译都会被破坏。
然而,仅仅将函数标记为constexpr
并不能保证在编译时对其求值。特别是,您的示例函数(根据标准(不能在编译时进行评估,因此它与主要问题正交。
正如注释中所述,如果不直接查询编译器,就无法在编译时真正找到endianness。编译器必须知道(因为它必须生成代码(,任何合理的编译器都会为您提供一种查询这些信息的方法(在编译时(。
这不是一个有效的constexpr
函数,因为它包含了reinterpret_cast
。这使得整个问题变得毫无意义。
这里概述了这不是有效的constexpr函数的原因:https://en.cppreference.com/w/cpp/language/constexpr.特别是,constexpr函数应该满足以下标准:
。。。至少存在一组参数值,使得函数的调用可以是核心常数表达式
reinterpret_cast
永远不能是核心常量表达式的一部分。
-std=c++2a
(,您可以尝试为具有不同端序的平台编译它,并检查它的行为是否正确。
#include <bit>
#include <iostream>
constexpr bool are_all_scalar_types_little_endian() {
return std::endian::native == std::endian::little;
}
constexpr bool are_all_scalar_types_big_endian() {
return std::endian::native == std::endian::big;
}
int main() {
std::cout << std::boolalpha
<< "little: " << are_all_scalar_types_little_endian() << 'n'
<< "big : " << are_all_scalar_types_big_endian() << 'n'
<< "mixed : " <<
(are_all_scalar_types_little_endian()==are_all_scalar_types_big_endian()) << 'n';
}