c++ как использовать значение constexpr с оператором []
Проблема происхождения в том, что я хочу использовать
const char*
или же
char []
в шаблонных аргументах, не относящихся к типу. Конечно, сейчас это не поддерживается. Итак, я хочу написать код для преобразования
char[]
к
std::integer_sequence
. Но я обнаружил серьезную проблему.
#include<utility>
template<typename T, std::size_t n>
constexpr auto f3(T (&a)[n])
{
return std::integer_sequence<T,a[0]>(); //simplified, it should be <T, a[i],...>
}
template<typename T, std::size_t n>
constexpr auto f2(T (&a)[n])
{
constexpr T v=a[3];
//.....other code
return v;
}
template<typename T, std::size_t n>
constexpr auto f1(T (&a)[n])
{
return a[3];
}
int main()
{
constexpr char a[]="abcdefg";
constexpr auto v1=f1(a);
//constexpr auto v2=f2(a);
//constexpr auto v3=f3(a);
}
F1 в порядке, но f2 и f3 ошибочны. Я запутался ..... Почему так? Похоже, что только "return xxx[yyy]" подходит для времени компиляции. Я не могу сохранить его в значении или передать другим функциям.
1 ответ
функции могут вызываться в контексте, отличном от constexpr, поэтому параметры никогда не являются constexpr:
a
это не так
f2
/
f3
не может использовать это в контексте.
Это хорошо,
a[3]
не используется в
constexpr
контекст. и
f1
может использоваться в постоянном выражении с соответствующим аргументом.