引用N M 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)创建一个AddValue类型的对象,该对象使用
值10。AddValue的构造函数将此值存储为theValue成员。内
for_each(),为coll的每个元素调用“()”。同样,这是操作符()的调用
传递的AddValue类型的临时函数对象。实际元素作为
论据。函数对象将其值10添加到每个元素。元素然后具有
以下值:
加10之后:
11 12 13 14 15 16 17 18 19

for_each()的第二次调用使用相同的功能来添加第一个元素的值
每个元素。它使用第一个元素初始化AddValue类型的临时函数对象
的集合:
for_each (coll.begin(), coll.end(), AddValue (*coll. begin()) ) ;

添加第一个元素后,输出如下:
22 23 24 25 26 27 28 29 30

我不明白的是在第二种情况下为什么输出不
22 34 35 36 37 38 39 40 41

含义是为每个 call 创建一个新的函子,还是为每个 call 使用该函子?

最佳答案

表达式AddValue(*coll. begin())创建一个类AddValue的临时对象。然后将该临时变量传递给for_each函数。然后for_each对对象的函数调用运算符-operator()进行调用(从coll.begin()coll.end()的每个元素一次)。

从技术上讲,for_each通过值(而不是引用)获取functor参数,因此,它实际上是在临时副本而非临时本身的副本上进行操作。

09-10 05:25
查看更多