1. 程式人生 > >常量表達式

常量表達式

n) n-1 cpp 聲明 定制 變量 層次 檢查 理由

常量表達式

Item 1:如果函數必須在編譯期進行求值,就將其聲明為constexpr

理由

需要用constexpr來告訴編譯器允許對其進行編譯期求值。

示例

階乘的例子:

constexpr int fac(int n)    //constexpr函數
{
return (n>1) ? n*fac(n-1) : 1;
}

void f(int n)
{
int f5 = fac(5);            //在編譯期間可能進行了求值
int fn = fac(n);            //在運行期間進行了求值(因為實參n是變量)
constexpr int f6 = fac(6);  //在編譯期間進行了求值
constexpr int fnn = fac(n); //錯誤:無法在編譯期求值,因為n的值在運行期才能得到
}

上例中給出了constexpr函數fac()的定義,在f()中列舉了幾種調用fac()的情形。在這裏,編譯期間能夠求值的前提是fac()要為constexpr函數,此外還要保證其實參為常量,表達式被賦值變量為constexpr類型。

註解

不要試圖讓所有函數都變成 constexpr。大多數計算都最好在運行時進行。

任何可能最終將依賴於高層次的運行時配置或者業務邏輯的API,都不應當是 constexpr 的。這種定制化是無法由編譯期來求值的,並且依賴於這種 API 的任何 constexpr 函數也都應當進行重構,或者拋棄掉 constexpr

Item 2: 以 constexpr 來定義可以在編譯期計算的值

理由

更好的性能,更好的編譯期檢查。

示例
constexpr int f6 = fac(6);  //在編譯期間進行了求值
constexpr int fnn = fac(n); //錯誤:無法在編譯期求值,因為n的值在運行期才能得到
註解

將變量聲明為constexpr類型,編譯器可以來驗證變量的值是否是一個常量表達式。聲明為constexpr的變量一定是一個常量,並且必須用常量表達式初始化。

常量表達式