首頁 > 後端開發 > C++ > 為什麼我不能在常數表達式中使用 `constexpr` 函數的函數參數?

為什麼我不能在常數表達式中使用 `constexpr` 函數的函數參數?

Mary-Kate Olsen
發布: 2024-11-14 15:06:02
原創
1050 人瀏覽過

Why Can't I Use a Function Parameter of a `constexpr` Function in a Constant Expression?

無法在常數表達式中使用constexpr 函數的函數參數

問題介紹和程式碼範例

提供的程式碼示範了嘗試在常數表達式式中利用constexpr 函數make_const 的回傳值,但遇到錯誤。

static constexpr int make_const(const int i) {
    return i;
}

void t1(const int i) {
    constexpr int ii = make_const(i);  // Error occurs here (i is not a constant expression)
    std::cout << ii;
}

int main() {
   t1(12); // Call the function
}
登入後複製

解釋和方法

與普遍看法相反,constexpr 函數不會神奇地在編譯時評估其參數。相反,它允許 constexprness 從其輸入參數傳播到其輸出。然而,在給定的程式碼中,函數參數 i 不是 constexpr,因此 constexpr 函數 make_const 無法將其轉換為 constexpr。

出現錯誤是因為後續賦值 constexpr int ii = make_const(i) 嘗試宣告一個 constexpr 變數 (ii),並使用非 constexpr 表達式 (make_const(i)) 的結果進行初始化。這是不允許的,因為 constexpr 變數必須始終使用 constexpr 表達式進行初始化。

理解constexpr 函數

constexpr 函數有兩個關鍵特徵:

  • 文檔:它向編譯器表明該函數(如果給定) constexpr 參數並在沒有未定義行為的情況下執行,可以在編譯時進行評估。
  • 指令:如果在需要 constexpr 的特定上下文中使用函數,它會提示編譯器在編譯時評估函數表達式。

要解決該錯誤,可以確保函數參數本身是constexpr。這可以透過將函數宣告修改為:

constexpr int make_const(constexpr int i) {
    return i;
}
登入後複製

此變更保證函數可以有效地將其 constexpr 輸入轉換為 constexpr 輸出,從而能夠在常數表達式中實現函數的預期用途。

在提供的替代程式碼範例中,函數 make_const 可以作為 t1 中的 constexpr 表達式進行調用,因為它的參數現在是 constexpr。但是,嘗試將非 constexpr 表達式(例如運行時變數)的結果傳遞到函數中仍然會導致錯誤,因為該函數需要 constexpr 參數才能執行 constexpr。

以上是為什麼我不能在常數表達式中使用 `constexpr` 函數的函數參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板