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);
}

https://godbolt.org/z/E5YPTM

F1 в порядке, но f2 и f3 ошибочны. Я запутался ..... Почему так? Похоже, что только "return xxx[yyy]" подходит для времени компиляции. Я не могу сохранить его в значении или передать другим функциям.

1 ответ

Решение

функции могут вызываться в контексте, отличном от constexpr, поэтому параметры никогда не являются constexpr:

a это не так f2/ f3 не может использовать это в контексте.

Это хорошо, a[3] не используется в constexprконтекст. и f1 может использоваться в постоянном выражении с соответствующим аргументом.

Другие вопросы по тегам