首頁 >後端開發 >C++ >為什麼引用參數會導致 Constexpr 函數出錯?

為什麼引用參數會導致 Constexpr 函數出錯?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-15 17:57:15934瀏覽

Why Do Reference Parameters Cause Errors in Constexpr Functions?

Constexpr 函數中引用參數的混淆

下面的程式碼片段嘗試在constexpr 函數中將兩個位元組數組連接成一個新位元組數組命名為concatenate。

template <size_t S1, size_t S2>
auto concatenate(const std::array<uint8_t, S1> &data1,
                 const std::array<uint8_t, S2> &data2)
{
    std::array<uint8_t, data1.size() + data2.size()> result; // Error occurs here

    // ...
}
但是,當使用 Clang 編譯時6.0 使用 C 17 標準時,會出現錯誤:「非型別模板參數不是常數表達式」。此錯誤源自於函數參數(data1 和 data2)的參考性質。

函數參數中的引用類型會觸發問題,因為常數表達式無法計算引用,如 C 標準中 [expr.1] 中所述。 const]/4:

「表達式e 是核心常數表達式,除非e... 的計算將計算引用引用類型的變數或資料成員的id 表達式,除非引用具有前面的初始化。 "

由於本例中的引用參數沒有前面的初始化,因此它們不能在常數表達式中使用。

要修正此問題,可以將程式碼修改為直接使用 S1 和 S2 範本參數,而不是依賴參考參數的 size() 成員函數:

以上是為什麼引用參數會導致 Constexpr 函數出錯?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn