C ++ Constexpr Функция - PullRequest
       7

C ++ Constexpr Функция

0 голосов
/ 14 сентября 2018

Может ли кто-нибудь помочь мне понять, почему этот фрагмент кода не скомпилируется?

#include <iostream>
#include <tuple>
#include <string_view>

constexpr auto Fields()
{
    using namespace std::string_view_literals;

    return std::tuple(
        std::tuple("campo_1"sv, 123),
        std::tuple("campo_2"sv, 456),
        std::tuple("campo_3"sv, 890),
        std::tuple("campo_4"sv, 136));
}

template<typename Tuple>
constexpr auto ProcessTupleElement(Tuple &&tuple)
{
    //constexpr auto ccb = std::get<1>(tuple); // 1 uncomment to get an error
    //char sx[ccb]; // 1 uncomment to get an error
    //(void)sx;
    return std::get<1>(tuple);
}

template<typename Tuple>
constexpr auto IterateTupleImpl(Tuple &&t)
{
    return ProcessTupleElement(std::get<0>(std::forward<Tuple>(t)));
}

template<typename Tuple>
constexpr auto IterateTuple(Tuple &&t)
{
    return IterateTupleImpl(std::forward<Tuple>(t));
}

int main()
{
    constexpr auto aa = IterateTuple(Fields()); // 2
    char sx[aa];
    (void)sx;
    return 0;
}

Код только для целей тестирования, я пытаюсь выяснить, почему в функции main (комментарий«2») Я могу определить переменную constexpr, которую затем использую для определения размера массива C, но пытаюсь сделать то же самое в функции ProcessTupleElement (отмечен как комментарий «1») Я получаю компиляторошибка, говорящая, что:
prog.cc:19:20: error: '* & tuple' is not a constant expression
19 | constexpr auto ccb = std::get<1>(tuple);
prog.cc:20:10: error: size of array is not an integral constant-expression
20 | char sx[ccb]; // 1

В качестве дополнительной информации я компилирую с GCC (C ++ 17).Моя идея, стоящая за этим тестом, состоит в том, чтобы во время компиляции выполнить итерацию кортежа, подобного определенному внутри функции Fields, чтобы проверить, есть ли у него повторяющиеся имена, но мне не удается решить предыдущую проблему, IE constexpr ness функции +переменные.

1 Ответ

0 голосов
/ 14 сентября 2018

аргумент не является constexpr (даже при использовании с constexpr на сайте вызова).

Помните, что функция constexpr может вызываться как обычная функция.

Кстати, вы могли бы упростить свой пример до

constexpr int identity(int n)
{
    // constexpr int i = n; // Invalid
    return n;
}

constexpr int the_answer = identity(42);
...