首頁  >  文章  >  後端開發  >  為什麼不能在常數表達式中使用函數參數?

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

Patricia Arquette
Patricia Arquette原創
2024-11-15 08:26:021001瀏覽

Why Can't I Use Function Parameters in Constant Expressions?

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

常數表達式是可以在編譯時計算的表達式。 Constexpr 函數是如果使用 constexpr 參數呼叫則可以在編譯時求值的函數。

在程式碼中,make_const 函數是一個 constexpr 函數。但是,t1 中的參數 i 不是 constexpr 參數,因為它沒有指定為 const。

void t1(const int i)
{
    constexpr int ii = make_const(i);  // error: i is not a constant expression
}

要解決此問題,可以透過將i 的型別變更為const int 使i 成為常數參數,或透過將t1 定義為constexpr 函數本身:

void t1(const int i)  // const int i to make i a constant parameter
{
    constexpr int ii = make_const(i);
}
constexpr int t1(const int i)  // constexpr t1 to make t1 a constexpr function
{
    return make_const(i);
}

使用a 時會出現另一個問題範本函數中的constexpr 函數旨在傳回constexpr 值。

template<int i>
constexpr bool do_something(){
    return i;
}

constexpr int t1(const int i)
{
    return do_something<make_const(i)>();   // error: i is not a constant expression
}

在這種情況下,編譯器無法保證參數 i 是常數表達式,因為它取決於模板的值傳遞給 do_something 的參數。為了確保 t1 可以在編譯時求值,模板參數 i 必須是常數表達式。

另一種方法是使用 std::variant 和 std::integral_constant 建立一個編譯時常數,可以與執行時間值結合使用。

template<auto I>
using constant_t=std::integral_constant<decltype(I),I>;
template<auto I>
constexpr constant_t<I> constant_v={};
template<auto...Is>
using var_enum_t=std::variant<constant_t<Is>...>;

這允許建立一個可以在運行時選擇的編譯時常數變體std::存取。

auto idx=var_index<5>(3/* 3 can be runtime */);
std::visit([](auto three){
  // three is a compile time value here
}, idx);

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

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