C++ Constexpr函数

yo_*_*gdg 0 c++ constexpr

任何人都可以帮我理解为什么这段代码片段无法编译?

#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函数+变量的问题.

Jar*_*d42 5

参数不是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)