在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命名空间中,去掉后缀? 纯粹是风格问题吗?
所有视图都有第二个版本
不,他们没有。
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)
创建筛选视图。