如何在编译期通过std-ranges获取随机访问容器?
问题:consteval环境下适配std::ranges::to的constexpr随机访问容器选择
原始代码
#include <ranges> #include <algorithm> auto func(const char* Str) { return std::string_view(Str) | std::views::split(',') | std::views::transform([](auto inp) { return inp.data(); }) | std::ranges::to<std::vector<const char *>>(); }
说明:我知道当test = "a,b"时,func(test)的结果是指向test的两个指针,输出会是["a,b", "b"],但我只关心字符串的起始部分。
尝试改为consteval函数后的问题
看到所有std::ranges函数都支持constexpr,因此尝试将该函数改为consteval版本:
template<const char * Str> consteval auto func() { return std::string_view(Str) | std::views::split(',') | std::views::transform([](auto inp) { return inp.data(); }) | std::ranges::to<std::vector<const char *>>(); }
编译时出现如下错误:
error: call to consteval function 'func
' is not a constant expression
note: pointer to subobject of heap-allocated object is not a constant expression
其中test是static constexpr char[]类型的字符串。我清楚错误来自std::vector的堆内存分配——尽管std::vector本身支持constexpr,但推测std::ranges::to并未将目标容器按constexpr上下文处理。
我还尝试过使用std::ranges::to<std::array>,但同样不被支持。想请教:是否存在其他支持随机访问、兼容constexpr,且可以配合std::ranges::to使用的容器?
内容的提问来源于stack exchange,提问作者billbillybill
相关产品推荐
相关产品推荐

