C++11 如果constexpr函数没有';你不能在编译时运行吗?

C++11 如果constexpr函数没有';你不能在编译时运行吗?,c++11,C++11,例如,我有一个constexpr函数,但我使用一个运行时变量(未标记为constexpr)来获取返回值。在这种情况下,我不确定函数是在编译时还是在运行时运行,所以有没有调试的方法 起初我考虑过static\u assert,但看起来static\u assert无法做到这一点。然后我想把代码转换成汇编代码,但是检查汇编代码太难了。在C++20之前,没有办法直接从程序本身处理它 使用C++20您就有了 如果constexpr func的返回类型是有效的非类型模板参数,则可以强制在编译时对函数进行如

例如,我有一个constexpr函数,但我使用一个运行时变量(未标记为
constexpr
)来获取返回值。在这种情况下,我不确定函数是在编译时还是在运行时运行,所以有没有调试的方法


起初我考虑过
static\u assert
,但看起来
static\u assert
无法做到这一点。然后我想把代码转换成汇编代码,但是检查汇编代码太难了。在
C++20
之前,没有办法直接从程序本身处理它

使用
C++20
您就有了

如果constexpr func的返回类型是有效的非类型模板参数,则可以强制在编译时对函数进行如下计算:

constexpr int func( int x ) 
{
    return x*2;
}

template < auto x > 
auto force_constexpr_evaluation()
{
    return x;
}

int main()
{
    int y = force_constexpr_evaluation<func(99)>();
}
constexpr int func(int x)
{
返回x*2;
}
模板<自动x>
自动强制执行评估()
{
返回x;
}
int main()
{
int y=力常数表达式求值();
}
如果您已经在使用
c++20
,则可以使用

在程序集级别进行调试应该不那么困难

  • 如果看到对constexpr func的函数调用,则它正在运行时运行
  • 如果直接看到转发的值,则它是在编译时计算的
  • 如果它是内联的,您应该能够通过将函数名从调试符号关联到内联代码的位置来检测它。通常,如果您在constexpr函数上设置了一个断点,并且它并不总是在编译时执行,而是内联执行,那么您将获得多个断点,而不仅仅是单个断点。即使它是一个,在这种情况下它也指向内联位置

:不可能将端口<代码>:ST::ISSKistangy评估为到旧编译器,因为它需要一些实现魔术。

C++标准没有编译时间和运行时间的概念。如果需要constexpr值,请将其指定为:
constexpr int x=yourfunc()问题,就C++语言而言,没有答案。只要语言规则没有被违反,C++实现就可以随心所欲。你预测了我想进一步问的一切。