簡體   English   中英

constexpr函數及其參數

[英]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)是該6hello(6)是一個constexpr函數參數,而ihello(i)是一個普通的int參數。

如果您將i聲明為constexpr int i = 6; ,則hello(i)將編譯並執行。

hello(int(6)) ,您要說的是將整數6轉換為int。 這是多余的操作。 hello(int(6))hello(6)將具有相似的行為,即使行為不相同。

bye()的工作原理,因為函數參數使用默認參數( j = 6constexpr int bye(int j = 6); )。 默認的初始化參數在編譯時是已知的,因此根據定義是constexpr

這里要注意的是,編譯器“驗證”代碼,而不“讀取”代碼。

編譯器期望constexpr的所有部分在編譯時都是已知的有效常量。 因此,盡管您和我從閱讀代碼中都知道i的值不會改變,但是除非您聲明i為常數,否則編譯器不會“知道”它。 就您而言,您可能已經在某處執行了其他代碼來更改i的值。

在沒有i的情況下調用函數的所有情況下,編譯器毫無疑問地知道j的值是值為6的常量整數(注意: int(6)與僅6 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM