我想知道为什么函子通过副本传递给algorithm
函数:
template <typename T> struct summatory
{
summatory() : result(T()) {}
void operator()(const T& value)
{ result += value; std::cout << value << "; ";};
T result;
};
std::array<int, 10> a {{ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }};
summatory<int> sum;
std::cout << "\nThe summation of: ";
std::for_each(a.begin(), a.end(), sum);
std::cout << "is: " << sum.result;
我期待以下输出:
总和:1;1个;2;3;5个;8个;13; 21; 34; 55; 是:143
但是sum.result
contains 0
,这是在 ctor 中分配的默认值。实现所需行为的唯一方法是捕获的返回值for_each
:
sum = std::for_each(a.begin(), a.end(), sum);
std::cout << "is: " << sum.result;
发生这种情况是因为函子是通过复制for_each
而不是通过引用传递给的:
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
所以外部函子保持不变,而内部函子(它是外部函子的副本)在执行算法(现场演示)后更新并返回,因此在执行所有操作后再次复制(或移动)结果。
必须有充分的理由以这种方式进行工作,但我并没有真正意识到这种设计的基本原理,所以我的问题是:
- 为什么序列运算算法的谓词通过复制而不是引用传递?
- 在按引用传递方法之前,按副本传递方法有什么优势?