NM Jousttis の「The C++ Standard Library」セクション 5.9 からの引用
#include < iostream>
#include < list>
#include < algorithm>
using namespace std;
//function object that adds the value with which it is initialized
class AddValue {
private:
int the Value; //the value to add
public:
//constructor initializes the value to add
AddValue(int v) : theValue(v) { }
//the "function call" for the element adds the value
void operator() (int& elem) const { elem += theValue; }
};
int main()
{
list<int> coll;
for (int i=1; i<=9; ++i)
coll.push_back(i);
//The first call of for_each() adds 10 to each value:
for_each (coll.begin(), coll.end(), AddValue(10)) ;
ここで、式 AddValue(10) は、値 10 で初期化されるタイプ AddValue のオブジェクトを作成します。AddValue のコンストラクターは、この値をメンバー theValue として格納します。for_each() 内では、coll の各要素に対して "()" が呼び出されます。繰り返しますが、これは、渡された AddValue 型の一時関数オブジェクトに対する operator () の呼び出しです。実際の要素が引数として渡されます。関数オブジェクトは、その値 10 を各要素に追加します。要素は次の値を持ちます: 10 を追加した後:
11 12 13 14 15 16 17 18 19
for_each() の 2 回目の呼び出しでは、同じ機能を使用して、最初の要素の値を各要素に追加します。コレクションの最初の要素で AddValue 型の一時関数オブジェクトを初期化します。
for_each (coll.begin(), coll.end(), AddValue (*coll. begin()) ) ;
最初の要素を追加した後の出力は次のようになります。
22 23 24 25 26 27 28 29 30
私が理解していないのは、出力がそうでない理由である2番目のケースです
22 34 35 36 37 38 39 40 41
呼び出しごとに新しいファンクターが作成されることを意味しますか、それとも呼び出しごとにファンクターが使用されますか?