Я пытаюсь написать функцию поиска constexpr, которая будет возвращать индекс массива std ::, содержащий определенное значение. Представленная ниже функция работает нормально, за исключением случаев, когда содержащийся тип имеет вид const char*
:
#include <array>
constexpr auto name1() {
return "name1";
}
constexpr auto name2() {
return "name2";
}
template <class X, class V>
constexpr auto find(X& x, V key) {
std::size_t i = 0;
while(i < x.size()) {
if(x[i] == key) return i;
++i;
}
return i;
}
int main() {
constexpr std::array<const char*, 2> x{{name1(), name2()}};
constexpr auto f1 = find(x, name1()); // this compiles
constexpr auto f2 = find(x, name2()); // this doesn't...
}
Странная вещь в том, что find(x, name1())
компилируется чисто, но find(x, name2())
завершается с ошибкой:
subexpression not valid in a constant expression
if(x[i] == key) return i; `
Как это выражение может работать при использовании с name1()
, но не работать при использовании с name2()
?
Я также нашел этот ответ , но пользователь создает класс массива с нуля, и я не хочу этого делать.