Constexpr 函數和常數表達式中的引用參數
在C 中,常數表達式是在編譯時計算為常數值的表達式-時間。考慮以下 constexpr 函數:
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; // Possible error here return result; }
使用 Clang 6.0 和 -std=c 17 編譯此函數時,由於在執行時評估 data1.size() 表達式,因此無法編譯。僅當參數為引用時才會出現此錯誤,這表示對 constexpr 函數中引用參數的行為有潛在誤解。
根據C 標準([expr.const]/4),表達式是核心常數表達式,如果其求值不涉及求值引用類型的變數或資料成員的id 表達式,除非它具有可在常數表達式中使用的前置初始化,或者其生命週期在核心常數的求值中開始表達式。
在給定的函數中,引用參數沒有預先初始化,導致它們的 size() 表達式非恆定。因此,它們不能在常數表達式中使用,從而導致編譯錯誤。
要解決該問題並在常數表達式中使用參考參數,只需提供前面的初始化或取代 data1.size( ) 和模板參數 S1。
以上是可以在常數表達式的 C Constexpr 函數中使用引用參數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!