我如何确认我的 constexpr 表达式实际上已经在编译时执行

How can I confirm that my constexpr expression has been actually performed in compile-time

由于 constexpr 不保证它会被处理 'in-compile-time',我想知道一些方法来检查我的代码是否真的在编译时执行过.

让我们假设我已经创建了一些仿函数 class,在执行时 returns 一个值数组。我希望它在编译时进行。

#include "Functor.hpp"

constexpr Functor<int> functor_g; // not sure if should be static too
auto globalArray = functor_g(); // not sure if should be also const/constexpr

int main()
{
    // ...
}

显然我不能在此处 运行 任何计时器,因为它们需要 运行 时间环境。

编辑: 我已经通过检查 godbolt.org 下的汇编结果确认它在编译时执行。这是一个小事情的方法,但我仍然会感谢其他一些方法。

How can I confirm that my constexpr expression has been actually performed in compile-time

您必须检查生成的程序集。

但是你只能检查特定平台的特定编译器的特定可执行文件。您不能保证,对于不同的编译器,您也可以从相同的代码中获得编译时执行。

从语言的角度来看,你可以强加编译时执行,但永远不要忘记 "Allows any and all code transformations that do not change the observable behavior of the program".

"as-if rule"

要强制执行编译时执行(忽略 "as-if rule"),您必须使用从 constexpr 函数返回的值,其中需要编译时的值。

一些例子(假设constexpr foo()函数returns一个std::size_t):

1) 初始化一个constexpr变量

constexpr std::size_t bar = foo();

2) C 风格数组大小

char bar[foo()];

3) 在模板参数中

std::array<char, foo()>  bar;

4) 在 static_assert() 测试中

static_assert( foo() == 3u, "isn't three");