在 c++20 的范围库中,所有视图都有第二个版本。
根据 cppreference:
对于任何合适的子表达式 E 和 P,表达式views::filter(E, P) 与filter_view{E, P} 表达式等价。
我们有实际的类,std::ranges::filter_view然后放入我们拥有的视图命名空间中std::ranges::views::filter。两者之间有什么区别,还是纯粹是风格问题?
所有视图都有第二个版本
不,他们没有。
filter_view是一种类型。filter是一个函子。通过调用函子,您可以创建相应类型(或接近足够类型)filter的对象。filter_view
但您也可以filter仅使用一个参数来调用函子:过滤谓词。此类调用的返回值是一个对象,您可以|根据范围创建等效对象filter_view,如您链接到的页面上所述:
ints | std::views::filter(even)
Run Code Online (Sandbox Code Playgroud)
你不能filter_view直接这样做。
因此,您可以使用常见的 C++ 表示法创建过滤视图:filter_view(range, predicate),也可以使用更实用的样式谓词表示法:range | views::filter(predicate)。