C++20 中的范围库支持表达式
auto view = r | std::views::drop(n);
使用范围适配器删除n
范围的第一个元素。r
drop
但是,如果我递归地从一个范围中删除元素,编译器会进入一个无限循环。
最小的工作示例:(在 GCC 10 中编译需要无限时间)
#include <ranges>
#include <iostream>
#include <array>
#include <string>
using namespace std;
template<ranges::range T>
void printCombinations(T values) {
if(values.empty())
return;
auto tail = values | views::drop(1);
for(auto val : tail)
cout << values.front() << " " << val << endl;
printCombinations(tail);
}
int main() {
auto range1 = array<int, 4> { 1, 2, 3, 4 };
printCombinations(range1);
cout << endl;
string range2 = "abc";
printCombinations(range2);
cout << endl;
}
预期输出:
1 2
1 3
1 4
2 3
2 4
3 4
a b
a c
b c
为什么这需要无限的时间来编译,我应该如何解决这个问题?