今天帮一个哥们调试C++程序时,跟踪for_each 算法析构函数调用三次,让我蛋疼了许久。经查阅,原来对象传递给函数参数,或者函数返回该类型对象时,将隐式调用复制构造函数。在对象生命周期结束,都要调用析构函数。
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
for ( ; first!=last; ++first ) f(*first);
return f;
}
for_each的源码。那么可以看到是以传值的方式传递的,那么先构造一个Function 临时对象,并将这个对象传给函数,那么传值过程中需要复制给它,那么就会调用拷贝构造函数,这样就2个了,再加上返回的f共3次,而实际上,在传值的过程中,可以直接构造,从而优化了一次。