微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不能在 `const filter_view` 上调用 `ranges::begin`?

如何解决为什么我不能在 `const filter_view` 上调用 `ranges::begin`?

我无法在 ranges::begin 上拨打 const filter_view

https://en.cppreference.com/w/cpp/ranges/filter_view beginend 似乎不是 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 库中的所有视图都是惰性的。在实践中意味着什么?这意味着在底层,它们通常在 beginend 和迭代器操作上比常规容器做得更多。通常为了能够保持这种懒惰,需要一些内部状态。例如,过滤视图可以将迭代器存储到最后一个匹配元素或沿着这些行的东西。在这种情况下,begin() 会更改此内部字段。甚至 cppreference 也提到了开始:

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

所以这是完全合理的 - 因为可以(并且很可能是)一个内部状态,begin() 和/或 end() 可以修改它们不能被 const

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。