C++20新特性—consteval與constinit
阿新 • • 發佈:2021-02-05
consteval可用在立即函式(immediate function),立即函式實際上是編譯時執行的函式,也就是它的引數在編譯時是“確定的”(常量),它的結果也是常量。constexpr可用於編譯或執行時函式,它的結果是常量。它們區別如下例,特別注意的是註釋掉的那行。
using namespace std; consteval int compileconst(int n) { return n+1;} constexpr int runcompileconst(int n) { return n+1;} int main() { int nn= compileconst (100); cout <<nn<<endl; // int nnn= compileconst (nn); //error , nn is not const int nnn= runcompileconst (nn); cout<<nnn; return 0; }
constinit variable表示該變數在程式(執行緒)開始就被分配的,與程式(執行緒)具有相同的生命週期,因此它有點static的意思,在編譯時被初始化。下面例子中被註釋掉的兩行會產生編譯錯誤,從中可以看出,constexpr的變數是const型別,只讀,constinit是說變數在程式開始時被初始化,是static型別,不能在執行時被建立,變數不要求是const型別。
using namespace std; consteval int sqr(int n) { return n * n;} constexpr int res1 = sqr(5); constinit int res2 = sqr(5); int main() { cout << res1 <<endl; // cout<<++res1<<endl; // error: increment of read-only variable 'res1' cout << res2 <<endl; cout<<++res2<<endl; //constinit auto res3 = sqr(5); // error: 'constinit' can only be applied to a variable with static or thread storage duration constinit thread_local auto res3 = sqr(5); cout << res3 <<endl; }