将对静态存储cstyle数组的引用从constexpr函数传递给另一个constexpr函数

时间:2019-01-29 16:01:47

标签: c++ arrays c++14

我无法将全局cstyle数组传递给C ++ 14的constexpr函数。 我有一个像这样的数组:

I22

我有两个功能:

static const char t[] = "sometext";

当我这样调用第一个函数时:

template <typename T, typename U, std::size_t N>
constexpr static auto count(T (&arr)[N], const U &val)
{
    auto cnt = 0;
    auto it(std::cbegin(arr));
    while (it != std::cend(arr))
    {
        if (*it == val)
            cnt++;
        it++;
    }
    return cnt;
}

template <typename T, std::size_t N> constexpr static auto count_wrapper(T (&arr)[N])
{
    constexpr auto num_elems(count(arr, ','));
    return num_elems;
}

我可以编译代码并运行它,但是当我这样调用第二个函数时:

std::cout << count(t, ',') << std::endl;

我得到一个错误:

  

main.cpp:实例化为constexpr auto   t(T(&)[N])[with T = const char;长   unsigned int N = 46]’:main.cpp:51:53:从此处开始   main.cpp:40:35:在constexpr中扩展“ count((*&arr),',')” main.cpp:40:20:错误:“ arr”不是常数   表达   constexpr auto num_elems(count(arr,',')+1);

2 个答案:

答案 0 :(得分:0)

参数不是/不能为OnResponse。 (constexpr函数可在非constexpr上下文中使用。)

请注意,constexpr可能是在运行时计算的。您将需要

std::cout << count(t, ',') << std::endl;

具有constexpr auto c = count(t, ','); std::cout << c << std::endl; 评估保证。

如果合适,您可以将值包装为类型。

constexpr

答案 1 :(得分:0)

什么是num_elems?如果是花哨的初始化,则可以按以下方式“重写”整个代码:

#include <cstdint>
#include <iterator>

const char t[] = "sometext";

template <typename T, typename U, std::size_t N>
constexpr auto count(const T (&arr)[N], const U &val)
{
    std::size_t cnt = 0;

    for(auto it = std::begin(arr); it != std::end(arr); ++it)
    {
        if (*it == val)
            cnt++;
    }

    return cnt;
}

template <typename T, std::size_t N> 
constexpr auto count_wrapper(const T (&arr)[N])
{
    auto const num_elems = count(arr, 'e');
    return num_elems;
}

int main()
{
    constexpr auto x = count_wrapper(t);
    return static_cast<int>(x);
}

这将编译并正确运行。我将,更改为e,因此它计算了一些元素。我也将while更改为for循环。我也确实将auto cnt更改为std::size_t cnt

请注意,由于autoxmain的类型为size_t

https://gcc.godbolt.org/z/3cdTzr