我无法打电话ranges::begin
on a const filter_view
https://en.cppreference.com/w/cpp/ranges/filter_view
the begin
and end
似乎不是const
。这是为什么?
int main(){
std::vector v{1,2,3};
// removing const will make it compile
const auto r = v | ranges::views::filter ([](auto&&){return true;});
ranges::begin(r);
}
https://godbolt.org/z/4feaYc
中的所有视图std::range
图书馆的设计是懒惰的。这在实践中意味着什么?这意味着他们通常会在幕后做更多的事情begin
, end
和迭代器操作比常规容器。通常为了能够维持这种惰性,需要一些内部状态。例如,filterred 视图可以将迭代器存储到最后一个匹配元素或类似的东西。在这种情况下begin()
改变这个内部场。甚至 cppreference 也对 begin 说了这样的话:
返回用 {*this, Ranges::find_if(base_, std::ref(*pred_))} 初始化的迭代器。为了提供范围概念所需的摊余常量时间复杂度,该函数将结果缓存在filter_view对象中以供后续调用使用。
所以这是完全有道理的 - 因为可以(并且很可能是)一个内部状态begin()
and/or end()
可以修改 不能修改const
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)