为了进行有意义的、显着的静态反射(编译时反射),您需要一种在编译时执行代码的方法。最初的静态反射 TS 提案使用了传统的模板元编程技术,因为这些是在编译时执行代码的唯一有效工具。
然而,作为constexpr
代码获得了更多功能,通过以下方式进行编译时静态反射变得越来越可行constexpr
功能。这种想法的一个问题是不能允许静态反射值泄漏到非编译时代码中。
我们需要能够编写必须only在编译时执行。对于函数中间的一小段代码来说,这样做很容易;该代码的运行时版本根本不包含反射部分,只包含它们的结果。
但是,如果您想编写一个接受反射值并返回反射值的函数怎么办?或者反射值列表?
该功能不能constexpr
,因为一个constexpr
功能must能够在运行时执行。你可以做一些事情,比如获取指向的指针constexpr
函数并以编译器无法跟踪的方式调用它们,从而强制它在运行时执行。
采用反射值的函数无法做到这一点。它必须仅在编译时执行。所以constexpr
不适合此类功能。
Enter consteval
:一个函数是“必需”仅在编译时执行 https://stackoverflow.com/questions/58466245/is-compiler-allowed-to-call-an-immediate-consteval-function-during-runtime/58467438#58467438。有一些特定的规则使得指向此类函数的指针不可能泄漏到运行时代码等中。
像这样,consteval
目前没有太多目的。它被用于有几个地方像source_location::current(), https://en.cppreference.com/w/cpp/utility/source_location/current这对于在运行时执行根本没有意义。但最终,该功能是尚不存在的进一步编译时编程工具的必要构建块。
这是在最初提出此功能的论文 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1073r0.html:
然而,本文的推动力是 SG7 在编译时反射领域所做的工作。现在普遍认为未来的反射语言支持应该使用constexpr
函数,但由于“反射函数”通常必须在编译时求值,因此它们实际上可能是立即函数。