是否在目标平台上评估了 constexpr?

Are constexpr evaluated on target platform?

我想知道,例如,在小端平台上编译的评估是否会在大端目标平台上 return 为真。

constexpr bool is_little_endian()
{
    int num = 1;
    return (1 == *(char *)&num);
}

换句话说,constexpr 是否像在目标上一样求值?

编辑:这个例子不正确,但问题仍然存在。

首先:如果您为给定目标编译代码,那么编译器将为那个目标生成代码。当然,这包括在编译时计算的表达式 - 否则涉及此类表达式的每个交叉编译都会被破坏。

但是,仅仅将一个函数标记为 constexpr 并不能保证它在编译时被计算。特别是,您的示例函数不能(根据标准)在编译时进行评估,因此它与主要问题正交。

如评论中所述,如果不直接查询编译器,您无法在编译时真正找出字节顺序。编译器必须知道(因为它必须生成代码)并且任何合理的编译器都会为您提供一种查询此信息的方法(在编译时)。

这不是一个有效的 constexpr 函数,因为它内置了 reinterpret_cast。这让整个问题变得毫无意义。

此处概述了此无效 constexpr 函数的原因:https://en.cppreference.com/w/cpp/language/constexpr。特别是,constexpr 函数应满足以下条件:

...there exists at least one set of argument values such that an invocation of the function could be an evaluated subexpression of a core constant expression

reinterpret_cast 永远不能成为核心常量表达式的一部分。

是的。如果您有可用的 C++20 编译器(可能 -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';
}