Я хочу сравнить представления строк во время компиляции следующим образом:
constexpr bool isMatch(const string_view str) {
if constexpr (str == "firstMatch"sv) {
return true;
} else if constexpr (str == "secondMatch"sv) {
return true;
}
// ....
}
И функция вызывается так:
isMatch("something"sv);
Что, очевидно, постоянно, потому что это правильно в коде.
Но компилятор говорит, что выражение внутри if constexpr «не является константой». Но оператор == для string_view — это constexpr. Решением было бы объявить параметр constexpr, но это невозможно.
Итак, как я могу иметь функцию constexpr, которая проверяет такие совпадения во время компиляции?
constexpr
изif constexpr
. - person KamilCuk   schedule 26.03.2021str
не является constexpr, поэтому выражениеstr == "abc"
не является constexpr. Обратите внимание, чтоconstexpr
функции могут вызываться во время выполнения, что означает, чтоstr
может быть известным значением во время выполнения, поэтому вы не всегда можете гарантировать, что значение известно во время компиляции. - person Timo   schedule 26.03.2021static_assert(false "invalid str")
в конце, чтобы убедиться, что строка действительна. - person Jojolatino   schedule 26.03.2021if
constexpr
или нет.if constexpr
в основном полезен, если вам приходится иметь дело с разными типами и аргументами шаблона. - person Timo   schedule 26.03.2021constexpr
этим не занимается. Чтобы он точно вызывался во время компиляции, вы можете сделать какconstexpr bool var = isMatch(..)
.and I could not make a
Потому что нельзя - аргументы функции могут меняться, они не constexpr. - person KamilCuk   schedule 26.03.2021consteval
. - person Timo   schedule 26.03.2021