首頁 >後端開發 >C++ >可以在常數表達式的 C Constexpr 函數中使用引用參數嗎?

可以在常數表達式的 C Constexpr 函數中使用引用參數嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-29 01:54:09660瀏覽

Can Reference Parameters Be Used in C   Constexpr Functions for Constant Expressions?

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

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