std::experimental::ranges::for_each
来自cppreference.com
                    
                                        
                    < cpp | experimental | ranges
                    
                                                            
                    |   template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity,           IndirectUnaryInvocable<projected<I, Proj>> Fun >  | 
(1) | (范围 TS) | 
|   template< InputRange R, class Proj = ranges::identity,           IndirectUnaryInvocable<projected<ranges::iterator_t<R>, Proj>> Fun >  | 
(2) | (范围 TS) | 
1) 按顺序,调用给定的函数对象 
f 到在解引用范围 [first, last) 中的每个迭代器时调用的投影 proj 的结果(即 ranges::invoke(f, ranges::invoke(proj, *i)) )。2) 同 (1) ,但以 
r 为源范围,如同以 ranges::begin(r) 为 first 并以 ranges::end(r) 为 last 。对于两个重载,若迭代器类型可变,则 f 可以通过解引用后的迭代器修改范围的元素。若 f 返回结果,则湖绿结果。
不同于另外的算法,不允许 for_each 复制序列中的元素,即使它们为可平凡复制。
不同于 std::for_each (它只要求可移动构造 (MoveConstructible) ),这些函数要求 Fun 实现 CopyConstructible 。
尽管声明描述如上,算法声明的模板形参的实际数量和顺序是未指定的。从而若在调用算法时使用显式模板实参,则程序很可能不可移植。
参数
| first, last | - | 要应用函数到的范围 | 
| r | - | 要应用函数到的范围 | 
| f | - | 应用到每个投影后的范围中元素的可调用对象 | 
| proj | - | 应用到元素的投影 | 
返回值
含有列二个成员的 tagged_pair :
-  第一成员带标签 
tag::in,是源范围的尾后迭代器(即比较等于哨位last的I类型迭代器)。 -  第二成员带标签 
tag::fun,(在该函数对象的所有应用后)从std::move(f)初始化。 
复杂度
准确应用 last - first 次 f 和 proj 。
可能的实现
template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryInvocable<ranges::projected<I, Proj>> Fun > auto for_each(I first, S last, Fun f, Proj proj = Proj{}) -> ranges::tagged_pair<tag::in(I), tag::fun(Fun)> { for(; first != last; ++first) { ranges::invoke(f, ranges::invoke(proj, *first)); } return {std::move(first), std::move(f)}; }  | 
示例
| 本节未完成 原因:暂无示例  | 
参阅
|   应用一个函数到元素范围  (函数模板)  | |
 范围 for 循环(C++11)
 | 
执行范围上的循环 | 
|    应用函数到范围中的元素   (函数模板)  | |
|    (C++17)  | 
   应用一个函数对象到序列的前 n 个元素  (函数模板)  |