C 11 引入了constexpr 說明符,使函數能夠在常數表達式中使用。儘管對函數行為提出了嚴格的要求,但它提供了一個至關重要的好處。
考慮一個函式庫函數最初傳回一個常數的場景,如圖所示在Awesome_lib.hpp 中:
inline int f() { return 4; }
如果沒有constexpr,客戶端程式碼可以使用此函數來實現需要編譯時常數的目的,例如模板參數或陣列維度。
#include#include std::array ; // needs CT template arg int my_c_array[f()]; // needs CT array dimension
但是,如果 f() 的實作變更為從設定檔中檢索其值,則此客戶端程式碼將會中斷。此變更將在客戶端編碼人員不知情的情況下有效地改變介面的使用。
透過將函數標記為 constexpr,程式設計師承認客戶端程式碼可以合理地預期其恆定性質。這確保了庫函數的使用不會因實現變更而受到影響。編譯器強制執行此期望,確保客戶端程式碼不依賴非常量函數。
類似於const 說明符對於成員函數,constexpr 說明符可防止客戶端程式碼依賴未來可能不可用的功能。然而,它們的執行機制有所不同。
const 說明符確保常數成員函數中的其他成員函數也是常數,而 constexpr 不會對其所有用途強制執行編譯時常數結果。這種靈活性允許混合函數在可能的情況下返回編譯時結果,但在非 constexpr 上下文下恢復到運行時計算。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3