提问者:小点点

“一个范围提案”为每个视图包括两个名称,有什么具体的原因吗?


在C++20的ranges库中,所有视图都有第二个版本。

例如,std::ranges::views::filter

我们有了实际的类std::ranges::filter_view,然后在视图命名空间中我们有了std::ranges::views::filter

根据CPPreference:

表达式views::filter(E,P)与任何合适的子表达式E和P的filter_view{E,P}表达式等效。

为什么所有视图都作为实际类包含在ranges命名空间中,带有一个view后缀,然后又包含在views命名空间中,去掉后缀? 纯粹是风格问题吗?


共1个答案

匿名用户

所有视图都有第二个版本

不,他们没有。

filter_view是一种类型。 filter是函子。 通过调用filter函子,可以创建相应filter_view类型(或near-esight)的对象。

但是您也可以只使用一个参数调用filter函子:筛选谓词。 这样一个调用的返回值是一个对象,您可以针对一个范围创建一个filter_view等效对象,如您链接到的页面所述:

ints | std::views::filter(even)

不能直接使用filter_view执行此操作。

因此,您可以使用常见的C++表示法:filter_view(range,predicate)创建筛选视图,也可以使用更具功能性的样式谓词表示法:range views::filter(predicate)创建筛选视图。