【发布时间】:2021-03-23 17:13:45
【问题描述】:
C++20 标准在 [range.adaptors.general] 中说范围适配器
在迭代结果视图时延迟评估。
另一方面,remark in [range.filter.view] for filter_view's begin function 提到缓存结果。那么适配器的懒惰到什么程度呢?
执行以下代码时:
#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 变量的值?如果不是,我在调用什么样的行为?它在哪里声明?
【问题讨论】:
标签: c++ c++20 std-ranges