常數表達式是可以在編譯時計算的表達式。 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中文網其他相關文章!