任何人都可以帮我理解为什么这段代码片段无法编译?
#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;
}
Run Code Online (Sandbox Code Playgroud)
代码仅用于测试目的,我试图弄清楚为什么在main函数中(注释"2")我能够定义一个constexpr变量,然后我用它来定义C数组大小,但是试图做功能相同ProcessTupleElement(标记为whit注释"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函数+变量的问题.
参数不是constexpr(即使在呼叫站点使用constexpr时).
请记住,constexpr函数可能被称为常规函数.
顺便说一句,你可能已经简化了你的例子了
constexpr int identity(int n)
{
// constexpr int i = n; // Invalid
return n;
}
constexpr int the_answer = identity(42);
Run Code Online (Sandbox Code Playgroud)