C++20 标准在[range.adaptors.general]中说范围适配器
在迭代结果视图时懒惰地评估。
另一方面,在[range.filter.view]中有一条关于 filter_view 的 begin 函数的注释,提到缓存结果。那么适配器的懒惰到什么程度呢?
执行以下代码时:
#include <iostream>
#include <ranges>
void print(std::ranges::range auto&& r)
{
for (const auto& item : r)
{
std::cout << item << ", ";
}
std::cout << " <end of range>\n";
}
int main()
{
using namespace std::ranges;
bool filter = false;
auto v = iota_view{4, 10} | views::filter([&filter](auto item){return filter;});
// multipass guarantee
static_assert(std::ranges::forward_range<decltype(v)>);
filter = true;
print(v);
filter = false;
print(v);
filter = true;
print(v);
}
是否保证适配器会尊重filter
变量的值?如果不是,我在调用什么样的行为,它在哪里声明?