3 回答
TA貢獻1827條經驗 獲得超9個贊
基本意義和句法
const聲明對象為 常量..這意味著,一旦初始化,該對象的值就不會改變,編譯器可以利用這一事實進行優化。它還有助于防止程序員編寫修改初始化后不打算修改的對象的代碼。 constexpr聲明一個適合在標準調用的對象中使用的對象 常數表達式..但請注意 constexpr不是唯一的辦法。
const只能用于非靜態成員函數,一般不能用于函數.它保證成員函數不會修改任何非靜態數據成員。 constexpr既可用于成員函數,也可用于非成員函數,也可用于構造函數。它聲明該函數適合用于 常數表達式..只有當函數滿足某些條件(7.1.5/3,4)時,編譯器才會接受它,最重要的是 (?) :函數體必須是非虛擬的,并且非常簡單:除了類型防御和靜態斷言之外,只有一個 return允許陳述。在構造函數的情況下,只允許初始化列表、類型防御和靜態斷言。( = default和 = delete但也是允許的。) 從C+14開始,規則就更寬松了,從那時起,在一個函數中允許這樣做: asm聲明,a goto語句,具有其他標簽的語句。 case和 default、嘗試塊、非文字類型變量的定義、靜態或線程存儲持續時間變量的定義、未對其執行初始化的變量的定義。 參數和返回類型必須為 文字類型
(一般來說,非常簡單的類型,通常是標量或集合)
常數表達式
constexpr
它可以用于需要編譯時評估的地方,例如模板參數和數組大小說明符: template<int N>class fixed_size_list{ /*...*/ };fixed_size_list<X> mylist; // X must be an integer constant expressionint numbers[X]; // X must be an integer constant expression但請注意: 這是可能的,因為 N,它是常量,并且在聲明時使用文字初始化,它滿足常量表達式的條件,即使它沒有聲明。 constexpr.宣布某事為 constexpr并不一定能保證在編譯時對其進行評估。它 可以使用對于這種情況,也可以在運行時對其進行評估的其他地方使用。 對象 可以,可能適合在常量表達式中使用 無被宣布 constexpr..例子: int main(){ const int N = 3; int numbers[N] = {1, 2, 3}; // N is constant expression}
constexpr?
阿 對象喜歡 N以上可用作常量表達式。 無被宣布 constexpr..以下所有對象都是如此: [這是由于第5.19/2節:常數表達式不得包括涉及“lvalue-rvalue修改”的子表達式,除非[…]是整數類型或枚舉類型的極值[…]。感謝理查德·史密斯糾正了我先前關于所有文字類型都是如此的說法。] const整數型或計數型 和
在聲明時使用本身是常量表達式的表達式初始化 為了 功能為了適合在常量表達式中使用,它 必明確聲明 constexpr它僅僅滿足常數表達式函數的準則是不夠的.例子: template<int N>class list{ };constexpr int sqr1(int arg){ return arg * arg; }int sqr2(int arg) { return arg * arg; }int main(){ const int X = 2; list<sqr1(X)> mylist1; // OK: sqr1 is constexpr list<sqr2(X)> mylist2; // wrong: sqr2 is not constexpr}
constconstexpr
A.在目標聲明中。constexprconst.
constexpr const int N = 5;
constexpr int N = 5;
static constexpr int N = 3;int main(){
constexpr const int *NP = &N;}NPconstexprconstconstexprNPconstintconst&N
B.成員職能聲明。constexprconst
constexpr void f();
constexpr void f() const;
const
- 3 回答
- 0 關注
- 496 瀏覽
添加回答
舉報
