C++ 函数对象应该是函数参数还是它的引用?

C++ 函数对象应该是函数参数还是它的引用?,c++,C++,我用下面的例子来说明我的问题: #include <boost/graph/adjacency_list.hpp> #include <iostream> #include <algorithm> class TestOperator { public: TestOperator(float k):k_(k){}; ~TestOperator() {}; float operator() (float m, float s)

我用下面的例子来说明我的问题:

#include <boost/graph/adjacency_list.hpp>
#include <iostream>
#include <algorithm>


class TestOperator
{
public:
    TestOperator(float k):k_(k){};

    ~TestOperator() {};

    float operator() (float m, float s)
    {
        return (1-k_)*m+k_*m*0.0078*s;
    }
private:
    float k_;

};

template<typename Operator>
void perform(Operator fun)
{
    int value;
    value = fun(3.1f,2.5f);

}

template<typename Operator>
void perform2(Operator &fun)
{
    int value;
    value = fun(3.1f,2.5f);

}


int main()
{

    TestOperator myOperator(0.1f);
    perform(myOperator);


    perform2(myOperator);

   return 0;
}
#包括
#包括
#包括。那么我的问题是:为什么不使用函数对象引用?对我来说,这更好。有什么想法吗

我的指导方针:

在大多数情况下使用
操作员乐趣

仅当
fun
具有不应从
operaor()
的一次调用复制到下一次调用的数据时,才使用
Operator&fun
。例如,如果使用
操作符
收集它保存在容器中的数据,则有必要通过引用传递
fun

函数对象(或functor)的结构中包含成员,在通过值传递时将被复制,而在通过引用传递时不被复制

在您的示例中,成员k_将通过引用调用“生存”,如perform2。如果由于某种原因,函子中保留了信息,而没有初始化,这可能会产生奇怪的副作用

可以使用“按引用传递”来收集和保留函子中从一种用法到下一种用法的信息

如果按值传递,所使用的副本将在返回时蒸发,调用之间的信息将丢失

换句话说,原始的函子myOperator由perform更改,但由perform2更改

您可以提供一个常量myOperator来执行,但不能像声明的那样执行。如果您将perform2声明为接受常量&,它将不会编译,因为函子中的函数不是常量(不能保证不会更改函子中的内容)


谁“更好”还不知道。在某些情况下,一种比另一种更适用,复制更“安全”,适用范围更广(如果理论上较慢)。

需要复制…传递值。不需要副本…通过引用传递。