2013-11-22 114 views
-1

enter image description here爲什麼用constexpr函數模板不會在編譯時

如組件(CALL指令)看到的constexpr是不是在編譯時評估的評估,爲什麼呢?

(使用附帶的碼塊(克++ 4.7.1最近GCC)與-std = C++ 11)

+1

注意一個更簡單的方法來檢查它在編譯時完成是一個靜態斷言。 – chris

+7

我並不知道低聲譽會阻止您將代碼放入問題中...... –

回答

2

constexpr不保證編譯時評估。它只保證constexpr,當編譯時常量輸入本身解析爲編譯時常量。

在這種情況下,編譯器選擇不評估getOdd(7),儘管它可能有。 (注意,getOdd本身不是constexpr,即使isEven是。)

編譯器可能會選擇優化和內聯,例如,增加優化級別。但這與constexpr無關。

+0

是的,就像Dietmar寫的,即使我將getOdd聲明爲constexpr,它仍然沒有優化。當我提高我的優化級別時,它確實如此。謝謝:) – Oded

2

getOdd()不是constexpr和編譯器當然不需要通過傳播常量表達式非constexpr功能。另外,您是否啓用了優化進行編譯?沒有優化,編譯器往往不會做任何otimizations。

0

g ++ -O3將在編譯時評估表達式。

請注意,簡單的getOdd實現將返回t | 1

+0

謝謝,很好的答案,但不是非常詳細的喬Z的。 和t | 1,我知道,但我想測試constexpr機制。 – Oded

相關問題