5

我不能ranges::begin打电话const filter_view

https://en.cppreference.com/w/cpp/ranges/filter_viewbegin似乎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

4

1 回答 1

2

库中的所有视图std::range都是设计为惰性的。在实践中意味着什么?这意味着在引擎盖下,它们通常比常规容器做更多的begin,end和迭代器操作。通常为了能够保持这种惰性,需要一些内部状态。例如,过滤视图可以将迭代器存储到最后一个匹配元素或类似的东西。在这种情况下,begin()更改此内部字段。甚至 cppreference 也这样说 begin :

返回用 {*this, ranges::find_if(base_, std::ref(*pred_))} 初始化的迭代器。为了提供范围概念所需的摊销常数时间复杂度,此函数将结果缓存在 filter_view 对象中以供后续调用使用。

所以这很有意义 - 因为可以(并且很可能是)一个内部状态,它begin()和/或end()可以修改它们不能被制作const

于 2021-02-25T10:13:55.727 回答