亚洲视频一区在线播放_亚洲avav天堂av在线网毛片_久久久久亚洲AV无码去区首_亚洲AV综合色区无码二区偷拍

C++11/C++14中constexpr的使用

來源:CSDN博客 | 2023-06-05 11:46:14 |

常量表達式(const expression)是指值不會改變并且在編譯過程中就能得到計算結果的表達式。字面值屬于常量表達式,用常量表達式初始化的const對象也是常量表達式。

只要有可能使用constexpr,就使用它


(資料圖片僅供參考)

C++11中constexpr的使用

constexpr是C++11中添加的一個特性,其主要思想是通過在編譯時而不是運行時進行計算來提高程序的性能,將時間花在編譯上,而在運行時節省時間(類似于模版元編程)。

C++11規定,允許將變量聲明為constexpr類型以便由編譯器來驗證變量的值是否是一個常量表達式。聲明為constexpr的變量一定是一個常量,而且必須用常量表達式初始化。

盡管不能使用普通函數作為constexpr變量的初始值,但C++11標準允許定義一種特殊的constexpr函數。這種函數應該足夠簡單以使得編譯時就可以計算其結果,這樣就能用constexpr函數去初始化constexpr變量了。

一般來說,如果你認定變量是一個常量表達式,那就把它聲明成constexpr類型

所有constexpr對象都是const對象,而并非所有的const對象都是constexpr對象。如果你想讓編譯器提供保證,讓變量擁有一個值,用于要求編譯期常量的語境,那么能達到這個目的的工具是constexpr,而非const。

constexpr函數是指能用于常量表達式的函數。定義constexpr函數的方法與其它函數類似,不過要遵循幾項約定:函數的返回類型及所有形參的類型都得是字面值類型,而且函數體中必須有且只有一條return語句。constexpr函數或構造函數被隱式地指定為內聯函數。

constexpr函數體內也可以包含其它語句,只要這些語句在運行時不執行任何操作就行。例如,constexpr函數中可以有空語句、類型別名以及using聲明

允許constexpr函數的返回值并非一個常量。constexpr函數不一定返回常量表達式。

和其它函數不一樣,內聯函數和constexpr函數可以在程序中多次定義。不過,對于某個給定的內聯函數或者constexpr函數來說,它的多個定義必須完全一致。基于這個原因,內聯函數和constexpr函數通常定義在頭文件中

constexpr函數只能調用其它constexpr函數,不能調用簡單函數(simple function)。constexpr函數不應該是void類型。constexpr函數中不允許有前綴增量(++i),在C++14中已刪除此限制。

constexpr函數的理解

(1).constexpr函數可以用在要求編譯期常量的語境中。在這樣的語境中,若你傳給一個constexpr函數的實參值是在編譯期已知的,則結果也會在編譯期間計算出來。如果任何一個實參值在編譯期未知,則你的代碼將無法通過編譯。

(2).在調用constexpr函數時,若傳入的值有一個或多個在編譯期未知,則它的運作方式和普通函數無異,亦即它也是在運行期執行結果的計算。這意味著,如果函數執行的是同樣的操作,僅僅應用的語境一個是要求編譯期常量的,一個是用于所有其它值的話,那就不必寫兩個函數。constexpr函數就可以同時滿足所有需求。

constexpr函數僅限于傳入和返回字面類型(literal type),意思就是這樣的類型能夠持有編譯期可以決議的值。在C++11中,所有的內建類型,除了void,都符合這個條件。但是用戶自定義類型同樣可能也是字面類型,因為它的構造函數和其它成員函數可能也是constexpr函數。

在C++11中,constexpr函數都隱式地被聲明為const。

以下為測試代碼:

namespace {// constexpr function: constexpr函數被隱式地指定為內聯函數constexpr int new_sz() { return 42; }constexpr size_t scale(size_t cnt) { return new_sz() * cnt; }constexpr int product(int x, int y) { return (x * y); }// pow前面寫的那個constexpr并不表明pow要返回一個const值,它表明的是如果base和exp是編譯期常量,pow的返回結果// 就可以當一個編譯期常量使用;如果base和exp中有一個不是編譯期常量,則pow的返回結果就將在執行期計算constexpr int pow(int base, int exp) noexcept{return (exp == 0 ? 1 : base * pow(base, exp - 1));}} // namespaceint test_constexpr_1(){// constexpr variablesconstexpr int mf = 20; // 20 is a constant expressionconstexpr int limit = mf + 1; // mf + 1 is a constant expressionconstexpr int foo = new_sz(); // foo is a constant expressionstd::cout << "foo:" << foo << "\n"; // foo:42// 當scale的實參是常量表達式時,它的返回值也是常量表達式;反之則不然int arr[scale(2)]; // okint i = 2;//int a2[scale(i)]; // error: scale(i)不是常量表達式size_t value = scale(i); // ok,constexpr函數不一定返回常量表達式std::cout << "value:" << value << "\n"; // value:84int sz = 1;//constexpr auto array_size = sz; // error, sz的值在編譯期未知const auto array_size1 = sz; // ok, array_size1是sz的一個const副本int arr2[product(2, 3)] = { 1, 2, 3, 4, 5, 6 };std::cout << "arr2[5]:" << arr2[5] << "\n"; // arr2[5]:6return 0;}

constexpr構造函數:盡管構造函數不能是const的,但是字面值常量類的構造函數可以是constexpr函數。事實上,一個字面值常量類必須至少提供一個constexpr構造函數。

constexpr構造函數可以聲明成=default的形式(或者是刪除函數的形式=delete)。否則,constexpr構造函數就必須既符合構造函數的要求(意味著不能包含返回語句),又符合constexpr函數的要求(意味著它能擁有的唯一可執行語句就是返回語句)。綜合這兩點可知,constexpr構造函數體一般來說應該是空的。我們通過前置關鍵字constexpr就可以聲明一個constexpr構造函數了。

constexpr構造函數必須初始化所有數據成員,初始值或者使用constexpr構造函數,或者是一條常量表達式。

constexpr構造函數用于生成constexpr對象以及constexpr函數的參數或返回類型。

以下為測試代碼:

namespace {class Debug {public:// constexpr構造函數必須初始化所有數據成員constexpr Debug(bool b = true) noexcept : hw_(b), io_(b), other_(b) {}constexpr Debug(bool h, bool i, bool o) noexcept : hw_(h), io_(i), other_(o) {}constexpr bool any() const noexcept { return hw_ || io_ || other_; }constexpr bool get_hw() const noexcept { return hw_; }constexpr bool get_io() const noexcept { return io_; }constexpr bool get_other() const noexcept { return other_; }void set_hw(bool b) noexcept { hw_ = b; }void set_io(bool b) noexcept { io_ = b; }void set_other(bool b) noexcept { other_ = b; }//constexpr void set_hw(bool b) noexcept { hw_ = b; } // C++14//constexpr void set_io(bool b) noexcept { io_ = b; }//constexpr void set_other(bool b) noexcept { other_ = b; }private:bool hw_, io_, other_;};constexpr Debug hw_debug(const Debug& d1, const Debug& d2) noexcept{return d1.get_hw() && d2.get_hw(); // 調用constexpr成員函數}} // namespaceint test_constexpr_2(){constexpr Debug debug(false, true, false);if (debug.any())std::cout << "any true" << std::endl; // will outputif (debug.get_io())std::cout << "get_io true" << "\n"; // will outputconstexpr Debug prod(false);if (prod.any())std::cout << "any true" << std::endl; // will not outputconstexpr auto hw = hw_debug(debug, prod); // 使用constexpr函數的結果來初始化constexpr對象std::cout << "hw:" << hw.get_hw() << "\n"; // hw:0return 0;}

注:以上內容主要整理自:《C++ Primer Fifth Edition》、《Effective Modern C++》

C++14中constexpr的使用

在C++11中,constexpr函數只能包含一組非常有限的語法,包括但不限于:typedefs、using和一條返回語句。在C++14中,允許的語法集大大擴展,包括最常見的語法,如if語句、多次返回、while或for循環等

以下為測試代碼:

namespace {// C++14 constexpr functions may use local variables and loopsconstexpr int pow2(int base, int exp) noexcept{auto result = 1;for (int i = 0; i < exp; ++i) result *= base;return result;}constexpr unsigned int factorial(unsigned int n) {if (n <= 1)return 1;elsereturn n * factorial(n - 1);}} // namespaceint test_constexpr_14_1(){constexpr auto value = pow2(2, 4);std::cout << "pow2 value:" << value << "\n"; // pow2 value:16constexpr auto value2 = factorial(5);std::cout << "factorial value:" << value2 << "\n"; // factorial value:120return 0;}

執行結果如下:

GitHub:https://github.com/fengbingchun/Messy_Test

關鍵詞:

亚洲视频一区在线播放_亚洲avav天堂av在线网毛片_久久久久亚洲AV无码去区首_亚洲AV综合色区无码二区偷拍

          久久天堂av综合合色蜜桃网| 韩国精品主播一区二区在线观看| 国产在线看一区| 久久久久久久国产精品影院| 亚洲mv在线观看| 久久视频一区二区| 丝袜诱惑制服诱惑色一区在线观看| av激情成人网| 色综合av在线| 国产日韩欧美在线一区| 奇米在线7777在线精品| 久久久久久久久岛国免费| 91成人免费网站| 国产精品美女久久久久久| 久久er99精品| 18欧美亚洲精品| 日韩一级黄色大片| 亚洲一区二区综合| 91丨porny丨首页| 色老综合老女人久久久| 国产精品久久久久7777按摩 | 日韩精品一区二区三区视频在线观看 | 国产一区二区三区日韩| 国产精品福利影院| 4438亚洲最大| 亚洲国产成人精品视频| 99久久国产免费看| 日本福利一区二区| 国产精品福利电影一区二区三区四区| 经典三级在线一区| 亚洲女爱视频在线| 久久只精品国产| 久久www免费人成看片高清| 亚洲欧洲99久久| 久久综合色天天久久综合图片| 日本三级韩国三级欧美三级| 国产精品蜜臀在线观看| 欧美一区二区免费| 日韩在线一区二区三区| 中文字幕欧美日韩一区| 欧美一级高清片在线观看| 日日夜夜精品视频天天综合网| 久久精品视频在线免费观看| 欧美精品三级在线观看| 丝袜亚洲另类欧美| 成人免费小视频| 国产日产欧美一区| 国产成人免费视频| 日本高清无吗v一区| 亚洲欧美日韩中文播放| 久久综合色播五月| 欧美一级在线免费| 麻豆视频观看网址久久| 亚洲精品乱码久久久久久| 日本一区二区三区国色天香| 国产精品一二三区在线| 色诱亚洲精品久久久久久| 亚洲三级在线播放| 国产亚洲欧美在线| 精品久久人人做人人爱| 国内精品伊人久久久久av影院| 亚洲一区二区三区视频在线| 日韩一区在线看| www久久精品| 日韩视频国产视频| 激情久久久久久久久久久久久久久久| 一二三区精品视频| 中文字幕字幕中文在线中不卡视频| 91一区二区三区在线观看| 91精品久久久久久久久99蜜臂| 免费不卡在线视频| 亚洲成av人**亚洲成av**| 亚洲综合在线观看视频| 国产精品嫩草99a| 欧美国产国产综合| 99国产精品久久久久久久久久| 制服丝袜亚洲色图| 国精产品一区一区三区mba桃花 | 亚洲手机成人高清视频| 国产日韩欧美亚洲| 久久精品一区二区| 91免费观看在线| 欧美大片一区二区| 国产成人aaa| 欧美一区二区视频网站| 精品一区二区三区在线观看国产| 在线亚洲免费视频| 蜜臀av一区二区| 在线国产亚洲欧美| 日本中文字幕不卡| 五月综合激情网| 视频一区二区国产| 色综合天天天天做夜夜夜夜做| 日日夜夜一区二区| 一本大道久久a久久精二百| 丝袜国产日韩另类美女| 婷婷国产在线综合| 免费人成网站在线观看欧美高清| 色伊人久久综合中文字幕| 免费久久精品视频| 欧美视频日韩视频| 国内精品久久久久影院薰衣草| 欧美日韩视频在线第一区 | 亚洲三级电影网站| 伊人婷婷欧美激情| 亚洲永久精品国产| 日韩不卡一区二区三区 | 亚洲欧美另类小说视频| 一片黄亚洲嫩模| 亚洲国产wwwccc36天堂| 日韩和的一区二区| 在线免费观看日韩欧美| 国内偷窥港台综合视频在线播放| 欧美高清精品3d| 不卡的电影网站| 久久精品视频一区二区三区| 国产色产综合产在线视频| 成人免费在线视频| 亚洲久草在线视频| 青青草成人在线观看| 欧美美女喷水视频| 成人激情av网| 欧美精彩视频一区二区三区| 亚洲视频免费在线| 性做久久久久久免费观看| 欧美在线你懂得| 国产91丝袜在线播放| 国产亚洲精品久| 日韩理论片一区二区| 亚洲国产cao| 欧美亚洲一区三区| 成人av网站在线观看免费| 国产片一区二区| 亚洲激情在线播放| 久久 天天综合| 欧美成人欧美edvon| 国产精品天美传媒沈樵| 亚洲午夜免费电影| 欧美日韩精品三区| 99精品视频一区二区| 亚洲人成在线播放网站岛国| 午夜不卡av在线| 丁香五精品蜜臀久久久久99网站 | 久久久久久麻豆| 一区二区三区精品视频在线| 91国偷自产一区二区三区成为亚洲经典 | 国产日韩综合av| 亚洲午夜私人影院| 欧美日韩www| 91理论电影在线观看| 一区二区三区中文字幕精品精品| 色婷婷av一区| 99久久综合狠狠综合久久| 最新高清无码专区| 欧美性大战久久久| 99视频超级精品| 亚洲人成电影网站色mp4| 在线精品观看国产| 久久天天做天天爱综合色| 亚洲高清中文字幕| 日韩欧美在线1卡| 国产精品久久久久婷婷二区次| 五月天激情综合| 欧美大肚乱孕交hd孕妇| 亚洲欧洲精品一区二区三区不卡| 久久精品理论片| 国产日韩欧美综合在线| 午夜私人影院久久久久| av一区二区久久| 亚洲一区二区精品视频| 欧美疯狂做受xxxx富婆| 欧美高清在线精品一区| 美国十次了思思久久精品导航| 精品国产麻豆免费人成网站| 亚洲综合在线视频| voyeur盗摄精品| 午夜精品久久久久久久99樱桃| 精品日韩在线一区| 亚洲国产综合视频在线观看| 高清shemale亚洲人妖| 亚洲精品视频在线观看网站| 在线电影国产精品| 1024成人网| 国产91综合一区在线观看| 亚洲美女一区二区三区| 91精品国产综合久久福利| 亚洲视频小说图片| 风间由美一区二区三区在线观看| 亚洲欧洲中文日韩久久av乱码| 欧美男同性恋视频网站| 最新久久zyz资源站| 国产乱码一区二区三区| 综合久久久久久| 日韩欧美国产麻豆| 亚洲综合视频网| 91免费观看国产| 麻豆国产91在线播放| 国产精品国产精品国产专区不蜜| 欧美在线制服丝袜| 中文字幕一区av|