split_view组合多分隔符拆分string/string_view的可行性及编译问题
C++视图组合的编译问题解析
为什么链式组合的代码无法编译?
先看这段无法编译的代码:
std::string line = "1[2]3"; for (const auto split : line | std::ranges::views::split('[') | std::ranges::views::transform([](const auto rng) {return std::string_view(rng); }) | std::ranges::views::split(']') | std::ranges::views::transform([](const auto rng) {return std::string_view(rng); })) { std::cout << split << '\n'; }
问题出在视图适配器的作用逻辑上:
std::ranges::views::split是对**整个上游范围(range)**进行拆分,而非对范围中的每个元素单独拆分。- 第一次
split('[')会把line拆分为两个子范围:"1"和"2]3",再经过transform转为std::string_view,此时得到的是一个包含两个string_view的范围。 - 紧接着调用
split(']')时,这个适配器会试图把整个包含两个string_view的范围当作输入来拆分,而split(']')要求输入范围的元素类型是可与char(即']')比较的类型,但string_view无法直接和char比较,类型不匹配导致编译失败。
为什么嵌套循环的代码可以正常运行?
再看这段可运行的嵌套循环代码:
for (const auto split_once : line | std::ranges::views::split('[') | std::ranges::views::transform([](const auto rng) {return std::string_view(rng); })) { for (const auto split_twice : split_once | std::ranges::views::split(']') | std::ranges::views::transform([](const auto rng) {return std::string_view(rng); })) { std::cout << split_twice << '\n'; } }
核心原因是拆分操作的作用对象正确:
- 外层循环先得到包含两个
string_view的范围("1"和"2]3")。 - 内层循环中,
split(']')是作用于单个string_view(比如"2]3"),而string_view本身是字符组成的范围,其元素类型char可以和']'正常比较,因此split能正确将"2]3"拆分为"2"和"3",后续的transform也能正常转为string_view,最终编译运行正常。
内容的提问来源于stack exchange,提问作者vss2sn
相关产品推荐
相关产品推荐

