为什么迭代器和函数对象pass by value,而不pass by reference const?

为什么迭代器和函数对象pass by value,而不pass by reference const?

说说我的理解吧(不一定正确)。

Effective C++ 说的是不适用于 STL 的迭代器和函数对象。为什么呢? 前面说了,pass by reference 通常意味真正传递的是指针。STL 的迭代器其实是一种“泛型指针”,是一种重载了 operator*,operator->,operator++,operator--等操作的 class template,既然迭代器可以看成是“指针”,那就没有必要使用 pass by reference了。

函数对象比较难解释,函数对象是行为类似函数的一个对象,一般是重载了operator() 的 struct 或者 class。这种函数对象,一般没有构造和析构函数,体积很小。在我们调用函数对象的时候,实际上不是真的传递了这个对象,而是传递了指向该对象的一个指针。事实上,把函数对象传递给算法时,比传递一个函数的效率高得多。我们可以做个小测试:

运行结果如图:

这只是利用 vector<int> 做的一个小测试,我们会发现,使用函数对象效率比使用一个函数高了一倍。

回到我们刚刚说的,传递函数对象,其实是传递了指向该对象的指针。

例如:

comp 是一个指向函数的指针,因此每次 sort 用到它的时候,编译器会使用产生一个间接函数调用,通过指针调用。既然函数对象也是有“指针”的用法,那么它也可以不用 pass by reference。

说的那么多,只有 test 才有说服力。如下:

测试一下结果:

然后将 foo 函数改成

将 "pass by reference" 改成 "pass by value" 的文本

再运行:

好吧我知道差别不是特别多而且受rand的影响,不过多次测试可以得到,平均来说,函数对象使用 pass by value 比 pass by reference 快那么一丢丢吧。

真正的解答要等到真大神来解释了。