常量表達式
阿新 • • 發佈:2018-08-05
n) n-1 cpp 聲明 定制 變量 層次 檢查 理由 Item 1:如果函數必須在編譯期進行求值,就將其聲明為
Item 2: 以
常量表達式
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的變量一定是一個常量,並且必須用常量表達式初始化。
常量表達式