Может ли кто-нибудь помочь мне понять, почему этот фрагмент кода не скомпилируется?
#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 функции +переменные.