日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

`constexpr`和`const`之间的区别?

發布時間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 `constexpr`和`const`之间的区别? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基本含義和語法

這兩個關鍵字都可以在對象聲明和函數中使用。應用于對象的基本區別是:

  • const聲明一個對象為常量。這意味著一個保證,一旦初始化,該對象的值不會改變,編譯器可以利用這個事實進行優化。它還有助于防止程序員編寫修改初始化后不打算修改的對象的代碼。
  • constexpr聲明一個對象適合在Standard調用常量表達式中使用。但請注意,這constexpr不是唯一的方法。

應用于功能的基本區別是:

  • const只能用于非靜態成員函數,而不能用于一般函數。它保證了成員函數不會修改任何非靜態數據成員。
  • constexpr可以與成員和非成員函數以及構造函數一起使用。它聲明了適用于常量表達式的函數。如果函數符合某些標準(7.1.5 / 3,4),編譯器將只接受它,最重要的是(?):
    • 函數體必須是非虛擬的,非常簡單:除typedef和靜態斷言之外,只return允許一個語句。在構造函數的情況下,只允許初始化列表typedefs和靜態聲明。(= default和= delete也被允許使用,但。)
    • 參數和返回類型必須是文字類型(即一般來說,非常簡單的類型,通常是標量或集合)

    ?

常量表達式

如上所述,constexpr聲明兩個對象以及適合在常量表達式中使用的函數。一個恒定的表達不僅僅是不變的:

  • 它可用于需要編譯時評估的地方,例如模板參數和數組大小說明符:?template<int N> class fixed_size_list { /*...*/ };??fixed_size_list<X> mylist; // X must be an integer constant expression??int numbers[X]; // X must be an integer constant expression
  • 但請注意:
    • 聲明一些東西constexpr并不一定保證在編譯時會被評估。它可以用于此類,但也可以在運行時評估的其他地方使用。
    • 一個對象可能適合在常量表達式中使用,而不需要聲明constexpr。例:?int main() { const int N = 3; int numbers[N] = {1, 2, 3}; // N is constant expression return 0; }

    這是可能的,因為N在聲明時使用常量來保持常量和初始化,即使沒有聲明,它也滿足常量表達式的條件constexpr。

那么我什么時候需要使用constexpr?

  • 像上面這樣的對象N可以作為常量表達式使用而不需要聲明constexpr。所有對象都是如此:
    • const
    • 積分或枚舉類型和
    • 在聲明時用一個本身就是常量表達式的表達式進行初始化

    [這是由于§5.19/ 2:一個常量表達式不能包括一個子表達式,涉及“左值,右值修改,除非[...]整數或枚舉類型的glvalue”感謝理查史密斯糾正我早些時候聲稱這對所有字面類型都是正確的。]

  • 要使函數適合在常量表達式中使用,必須明確聲明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 return 0; }

我什么時候可以同時使用const和constexpr?一起使用?

A.在對象聲明中。當兩個關鍵字都指向同一個被聲明的對象時,這是不必要的。constexpr意味著const。

constexpr const int N = 5;

是相同的

constexpr int N = 5;

但是,請注意,可能會出現以下情況:關鍵字分別指向聲明的不同部分:

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

在這里,NP被聲明為一個地址常量表達式,即一個本身就是一個常量表達式的指針。(當通過將地址運算符靜態/全局常量表達式生成的地址。這是可能的。)在這里,無論是constexpr和const是必需的:constexpr總是指表達被宣布(在這里NP),而const指的是int(它聲明了一個指針-給const)。刪除const會導致表達式不合法(因為(a)非const對象的指針不能是常量表達式,(b)&N實際上是指向常量的指針)。

B.在成員函數聲明中。在C ++ 11中,也constexpr暗示const了成員函數。但是,這在C ++ 14中可能會改變。根據目前的草案,由于建議修改§7.1.5/ 8 ,constexpr將const?僅針對對象,而不針對成員職能。因此,在C ++ 11下聲明一個成員函數為

constexpr void f();

將不得不被宣布為

constexpr void f() const;

在C ++ 14下仍然可以用作const函數。最好將你的constexpr成員函數標記為const現在,以免稍后改變很多代碼。

總結

以上是生活随笔為你收集整理的`constexpr`和`const`之间的区别?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 叶爱在线 | 欧美性生活在线视频 | 亚洲黄色在线看 | www日韩在线观看 | 特级西西444www大胆免费看 | 亚洲最黄网站 | 男女av| 日韩手机在线视频 | 日皮视频免费观看 | 人妻少妇被猛烈进入中文字幕 | 一级特黄bbbbb免费观看 | 91国在线视频 | 扒开腿揉捏花蒂h | 欧美大片91 | 黄色网www| 野外(巨肉高h) | 无遮挡的裸体按摩的视频 | 黄色一级在线 | 欧美黑人添添高潮a片www | 一本一道人人妻人人妻αv 九一在线视频 | 最近中文字幕在线中文高清版 | 男女性网站| 九色91porny | 欧美xxx在线观看 | 99自拍网 | a视频在线观看 | 红桃视频一区二区三区免费 | 国产一区二区激情视频 | 亚洲免费三级 | 国产免费av片在线观看 | 人妻无码久久精品人妻 | 九草在线观看 | 国产a视频精品免费观看 | 丁香婷婷激情五月 | 免费黄色小视频在线观看 | 亚洲精品久久久久久久蜜桃臀 | 中国一级黄色 | 免费污污视频在线观看 | 中文字幕在线观看网 | 久久久综合网 | 男女男网站 | 久热色| 欧美日韩三 | 国产农村妇女毛片精品久久麻豆 | 黄网站在线免费看 | 艳妇乳肉亭妇荡乳av | av福利在线免费观看 | 最新黄色av | 精品熟妇一区二区三区 | 国产精品视频久久久久久久 | 夜夜嗨av色一区二区不卡 | 亲子乱对白乱都乱了 | 日韩系列在线 | 成人欧美一区二区三区在线播放 | 粉嫩aⅴ一区二区三区 | 久久精品国产一区二区三区 | 亚洲天堂资源网 | www色com| 成人h网站 | 在线观看av一区二区 | 亚洲欧美日韩第一页 | 国内精品999 | 男生插女生视频 | 国产乱人乱精一区二视频国产精品 | 视频在线a| 日韩精品一二三四区 | 越南性xxxx精品hd | 日日干视频 | 日日狠狠久久偷偷四色综合免费 | 亚洲精品社区 | 亚洲av永久中文无码精品综合 | 久久中文字幕在线观看 | 人人人插| 女女调教被c哭捆绑喷水百合 | 久久网站免费观看 | 色婷婷久 | 五月婷婷狠狠 | 狼人狠狠干 | 奇米影视中文字幕 | 国产伦精品一区二区三区精品 | 香蕉av一区 | 日本少妇在线 | 欧美一区二区三区国产 | 国产午夜三级一区二区三 | 多男调教一女折磨高潮高h 国内毛片毛片毛片毛片毛片 | 国产女合集 | 国产精品二区在线观看 | 粉嫩av一区二区三区四区五区 | 50部乳奶水在线播放 | 五月天婷婷激情视频 | 欧美第一页草草影院 | 成人xxx视频| jzzjzz日本丰满成熟少妇 | 国产精品欧美日韩 | 久草影视在线观看 | 九色porny蝌蚪视频 | 欧美少妇精品 | 日韩伦乱 | 免费看特级毛片 |