如何在constexpr函数中使用临时变量?

Joh*_*n K 5 c++ constexpr

这是我想要做的简化版本.

constexpr float f(float a, float b){
    constexpr float temp = a+b;
    return temp*temp*temp;
}
Run Code Online (Sandbox Code Playgroud)

在我的版本中,a + b更复杂,所以我不想剪切和粘贴三次.使用3*(a + b)也不是实际功能的有效解决方案.我试图保持与语法相关的问题,而不是代数.我可以通过将+ b移动到它自己的constexpr函数来实现它,但我宁愿不用其他无用的函数来污染命名空间.

小智 6

正如您所发现的那样,您无法在constexpr函数体内声明变量,甚至是constexpr变量.

通过将其作为参数传递给第二个constexpr函数,仍然可以分解出一个公共表达式.对于你在这里给出的例子:

constexpr float pow3(float c) {
    return c*c*c;
}

constexpr float f(float a, float b) {
    return pow3(a+b);
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*n K 3

这在 C++11 中是不允许的,但现在在 C++14 中允许。

请参阅https://en.wikipedia.org/wiki/C%2B%2B14#Relaxed_constexpr_restrictions

  • 你应该反过来做。`f2(float temp) { return temp * temp * temp; }` 和 `f(float a, float b) { return f2(a + b); }`。这样你就可以避免 3 个电话。 (2认同)
  • @JohnK:这对于编译的代码来说并不重要,但对于编写和阅读该代码的人来说确实很重要。对于写这篇文章的人来说:更少的重复=更少的犯错机会。对于阅读它的人来说:更容易弄清楚你的值是相同值的三倍。 (2认同)