2012-08-11 53 views
5

这是我想要做的简化版本。如何在constexpr函数中使用临时变量?

constexpr float f(float a, float b){ 
    constexpr float temp = a+b; 
    return temp*temp*temp; 
} 

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

+4

这是关于constexpr最令人头疼的事情。 – 2012-10-14 18:12:22

回答

3

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

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

+2

你应该反过来做。 'f2(float temp){return temp * temp * temp; }'和'f(float a,float b){return f2(a + b);} }'。这样你避免了3次电话。 – 2013-01-08 13:25:28

+0

这与constexpr无关,因为它向编译器指示函数的结果可以在编译时记忆和/或评估。编译器将调用temp一次并重复使用该值3次。总共1加,3乘你的方式和我的方式。但正如我在介绍中所说的那样,我简化了这个问题,因为这个问题不是关于代数的。 – 2013-02-23 16:20:06

+2

@JohnK:编译代码并不重要,但它对编写和读取代码的人来说很重要。对于编写它的人来说:减少重复次数=减少犯错误的机会。对于阅读它的人来说:更容易弄清楚你有三倍相同的价值。 – celtschk 2013-06-08 23:35:28

6

正如你已经发现,你不能声明变量,甚至constexpr的,一个constexpr函数体内部。

通过将它作为参数传递给第二个constexpr函数,仍然可以将一个通用表达式分解出来。例如你在这里给出的例子:

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

constexpr float f(float a, float b) { 
    return pow3(a+b); 
}