[英]constexpr function and its parameter
constexpr int hello(int j) {
return j * 12;
}
constexpr int bye(int j = 6) {
return j * 12;
}
int main() {
int i = 6;
constexpr int a1 = hello(i); //error
constexpr int a2 = hello(6); //ok
constexpr int a3 = hello(int(6)); //ok
constexpr int a4 = bye(); //ok
constexpr int a5 = bye(i); //error
constexpr int a6 = bye(6); //ok
return 0;
}
hellow(i)
和hello(6)
什么區別? 我認為是int j = i;
並且j不是constexpr,而另一個是int j = 6
並且j仍然不是constexpr,兩個j都是int
類型。
int *文字!= constexpr ,因此返回類型不是constexpr。
我從書中的一個例子得到了上述結論:
int staff_size = 27; //staff_size is not a const expression
盡管staff_size是從文字中初始化的,但它不是常量表達式,因為它是普通int,而不是const int。
而且,我注意到hello(int(6))
可以正常工作,這里的“內容”是什么?
另外, bye()
可以工作而hello(i)
不能工作,兩個參數都在函數內部初始化,只有一個具有默認值,這有什么意義?
很困惑,希望有人可以解釋:D
PS:不知道要找到一個更好的標題,對此感到抱歉
之間的差hello(6)
和hello(i)
是該6
在hello(6)
是一個constexpr
函數參數,而i
在hello(i)
是一個普通的int
參數。
如果您將i
聲明為constexpr int i = 6;
,則hello(i)
將編譯並執行。
在hello(int(6))
,您要說的是將整數6
轉換為int。 這是多余的操作。 hello(int(6))
和hello(6)
將具有相似的行為,即使行為不相同。
bye()
的工作原理,因為函數參數使用默認參數( j = 6
在constexpr int bye(int j = 6);
)。 默認的初始化參數在編譯時是已知的,因此根據定義是constexpr
這里要注意的是,編譯器“驗證”代碼,而不“讀取”代碼。
編譯器期望constexpr的所有部分在編譯時都是已知的有效常量。 因此,盡管您和我從閱讀代碼中都知道i
的值不會改變,但是除非您聲明i
為常數,否則編譯器不會“知道”它。 就您而言,您可能已經在某處執行了其他代碼來更改i
的值。
在沒有i
的情況下調用函數的所有情況下,編譯器毫無疑問地知道j
的值是值為6
的常量整數(注意: int(6)
與僅6
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.