常量
constexpr
constexpr聲明了一個可以在編譯時求值的常量表達式,用于變量、函數和構造函數。
I.constexpr關鍵字聲明的變量必須在編譯時就能得到一個常量的值。
II.constexpr指示函數可以在編譯時進行求值。這樣的函數只能包含可以在編譯時求值的表達式,并且它們的參數和返回值類型必須是字面類型。字面類型是指在編譯期間可以被完全求值的類型,包括算術類型、指針類型、枚舉類型以及由這些類型組成的數組、結構體和聯(lián)合體。調用constexpr函數時,如果參數是常量表達式,結果也將在編譯時求值。
Case :

III.constexpr可以用于聲明構造函數,使得對象可以在編譯時進行構造。
Case :

使用constexpr可以在編譯時進行更多的計算,從而提升性能和靈活性。然而,constexpr有一些限制,如不能包含非常量表達式的語句、不能使用動態(tài)內存分配等。
擴展
C++20開始,在constexpr上下文中可以使用std::string和std::vector。
Case 1 :

Case 2 :

C++20開始,std::string和std::vecotr具有限定的構造函數和析構函數,這是可在編譯時使用的前提。所以,分配給string或vector對象的內存,也必須在編譯時釋放。如果試圖在運行時使用constexpr函數返回的vector或string對象,會得到在常量求值期間分配內存的錯誤。因為在編譯期間分配并釋放了vector和string對象,所以它們在運行時不可用。如需在運行時使用它們,可以考慮用array或內置數組替換vector,用字符數組或string_view替換string。
此外,在運行時仍然可以使用vector和string對象的適配constexpr的方法,比如size。

constexpr和宏
I.constexpr是在編譯時求值的機制,它在編譯期間計算常量的值,并在運行時使用該值。而宏是在預處理階段進行簡單的文本替換。
II.constexpr在編譯時對常量進行類型檢查,確保常量的類型是正確的。它保留了C++的類型系統(tǒng),并提供了更好的類型安全性。而宏沒有類型信息,無法進行類型檢查,可能導致潛在的類型錯誤。
III.宏在預處理階段進行簡單的文本替換,這意味著它允許符號重定義。如果在多個地方使用相同的宏定義,后面的定義將覆蓋前面的定義。這可能導致不可預測的行為。而constexpr具有唯一定義,不會出現(xiàn)符號重定義的問題。
簡而言之,一般使用constexpr定義常量,而將宏定義主要用于其他的預處理任務。