std::for_each の戻り値

std::for_each の戻り値って void だと思っていたんですが、どうやら第三引数が返ってくるらしい。

#include <vector>
#include <iostream>

int
main(){
    std::vector<int> v{1, 2, 3, 4, 5};
    std::for_each(v.begin(), v.end(), [](auto n){
        std::cout << n << std::endl;
    })(42);

    struct adder{
        int value = 0;
        void operator()(int n){ value += n; }
    };
    auto sum = std::for_each(v.begin(), v.end(), adder{});
    std::cout << sum.value << std::endl;

    return 0;
}
/* output:
1
2
3
4
5
42
15
*/

一番最後に処理を追加したい場合とか、副作用がある関数オブジェクトを指定している場合に便利そう。

[参照]