1. 程式人生 > 其它 >C++20新特性—consteval與constinit

C++20新特性—consteval與constinit

技術標籤:C/C++c++

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;
}