在下面的代碼中,constexpr第 2 行沒有給出錯誤,但第 1 行給出了錯誤。
#include <iostream>
using namespace std;
class ComplexNum{
public:constexpr ComplexNum(int _r=0,int _i=0):r(_r),i(_i){}
private:
int r,i;
};
int randGen(){
return 10;
}
constexpr int numGen(int i,int j){
return i j;
}
int main()
{
constexpr int i=10,j=20;
constexpr ComplexNum c3(randGen(),randGen()); //line 1
constexpr ComplexNum c4(numGen(i,j),numGen(i,j));//line 2
return 0;
}
據我所知,constexpr在編譯時評估運算式。
那么,編譯器是否應該能夠評估第 1 行中的運算式,因為它回傳一個常量整數(在這種情況下為 10)?如果沒有,第 2 行會怎樣?
uj5u.com熱心網友回復:
編譯器無法編譯第一行,因為randGen()is not constexpr。編譯器無法神奇地判斷一個函式是否為 constexpr。也許它看起來是 constexpr,但您實際上希望它在運行時運行。出于這個原因,編譯器不會評估未明確標記為 constexpr 的運算式。做這個:
#include <iostream>
using namespace std;
class ComplexNum{
public:constexpr ComplexNum(int _r=0,int _i=0):r(_r),i(_i){}
private:
int r,i;
};
constexpr int randGen(){
return 10;
}
constexpr int numGen(int i,int j){
return i j;
}
int main()
{
constexpr int i=10,j=20;
constexpr ComplexNum c3(randGen(),randGen()); //line 1
constexpr ComplexNum c4(numGen(i,j),numGen(i,j));//line 2
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515305.html
標籤:C
