2012-08-11 74 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); 
}