亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“警察”和“警察”的區別

“警察”和“警察”的區別

C++
湖上湖 2019-07-02 14:56:29
“警察”和“警察”的區別有什么區別constexpr和const?我什么時候才能用其中之一?我什么時候可以使用兩者,我應該如何選擇一個?
查看完整描述

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.在目標聲明中。當兩個關鍵字都引用要聲明的同一個對象時,這是不必要的。constexpr暗示const.

constexpr const int N = 5;

是相同的

constexpr int N = 5;

但是,請注意,在某些情況下,每個關鍵字都引用聲明的不同部分:

static constexpr int N = 3;int main(){
  constexpr const int *NP = &N;}

這里,NP聲明為地址常量表達式,即本身為常量表達式的指針。(當通過將地址運算符應用于靜態/全局常量表達式生成地址時,這是可能的。)在這里,都是constexprconst需要:constexpr總是引用被聲明的表達式(在這里)NP),同時constint(它聲明了一個指向Const的指針)。移除const將表達式呈現為非法(因為(A)指向非Const對象的指針不能是常量表達式,并且(B)&N實際上是一個指向常量的指針)。

B.成員職能聲明。在C+11中,constexpr暗示const,而在C+14和C+17中,情況并非如此。在C+11下聲明為

constexpr void f();

需要宣布為

constexpr void f() const;

在C+14下,以便仍然可用作const功能。


查看完整回答
反對 回復 2019-07-02
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

const申請變量,和防止它們被修改在你的密碼里。

constexpr告訴編譯器表達結果編譯時間常數,因此可以在數組長度之類的地方使用,將const變量等鏈接Oli給出了很多很好的例子。

基本上,它們是兩個完全不同的概念,可以(而且應該)一起使用。


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 496 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號