首頁 > 後端開發 > C++ > 主體

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

Patricia Arquette
發布: 2024-11-15 08:26:02
原創
1000 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板