如何解决C++20 中引入的 std::views::all 是什么?
#include <vector>
#include <ranges>
int main()
{
auto v = std::vector{1,2,3,4};
v | std::views::drop(2); // ok
std::views::all(v) | std::views::drop(2); // also ok
}
使用 g++11 -std=c++20
成功编译。但我看不出 v | std::views::drop(2)
和 std::views::all(v) | std::views::drop(2)
之间有什么区别。
所以,我的问题是:
什么是 std::views::all
在 C++20 中引入的?
解决方法
但我看不出 v | std::views::drop(2)
和 std::views::all(v) | std::views::drop(2)
之间有什么区别。
确实,两者之间没有区别 - 因为 v | views::drop(2)
已经意味着 views::all(v) | views::drop(2)
。
views::all
是范围的实现细节,以确保范围适配器始终适应视图(而不是范围)。 views::all(v)
所做的只是确保结果是一个视图,也就是说(来自 [range.all]):
给定一个子表达式 E
,表达式 views::all(E)
是表达式等效于:
-
decay-copy(E)
如果E
模型的衰减类型view
。 - 否则,如果表达式格式正确,则为
ref_view{E}
。 - 否则,
subrange{E}
。
在您的情况下,v
是一个 vector<int>
,它不会对 view
建模。但它是一个左值,所以 ref_view{v}
将是格式良好的,所以会发生这种情况。
所有适配器内部都使用 views::all
。例如,drop_view
有以下推导指南:
template <class R>
drop_view(R&&,range_difference_t<R>) -> drop_view<views::all_t<R>>;
因此,如果您编写了 drop_view(v,2)
(并且您永远不应该直接使用 meow_view
,而是始终使用 views::meow
),那么它本身就会为您调用 views::all
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。