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中文網其他相關文章!