根据本文,我希望for_each实际上会修改作为其第三个参数给出的对象,但似乎for_each在一个临时对象上运行,甚至不会修改给它的对象。

那么,为什么以这种方式实现呢?似乎用处不大。还是我误会了某些内容,并且下面的代码包含错误?

#include <iostream>
#include <vector>
#include <algorithm>

template <class T> struct Multiplicator{
    T mresult;
  public:
    const T& result() const{return mresult;}
    Multiplicator(T init_result = 1){
      mresult = init_result;
    }
    void operator()(T element){
      mresult *= element;
      std::cout << element << " "; // debug print
    }
};

int main()
{
    std::vector<double> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    Multiplicator<double> multiply;
    std::for_each(vec.begin(),vec.end(),multiply);
    std::cout << "\nResult: " << multiply.result() << std::endl;
    return 0;
}

预期产量:
1 2 3 Result: 6

但是得到以下输出:
1 2 3 Result: 1

最佳答案

函数对象按值获取。 for_each返回函数对象,因此,如果将其更改为:

multiply = std::for_each(vec.begin(),vec.end(),multiply);

您将获得预期的输出。

10-06 07:22
查看更多