在此函数中使用引用参数是否有任何优势?

Bee*_*and 2 c++ reference copy-constructor

我已经定义了以下类:

class Action
{
    public: 
    Action(){ _bAllDone = false; }

    void AddMove( Move & m );
    private:
        std::deque<Move> _todo;
        bool _bAllDone;
};
Run Code Online (Sandbox Code Playgroud)

成员AddMove定义如下:

void Action::AddMove( Move & m )
{ 
    _todo.push_back( m ); 
}
Run Code Online (Sandbox Code Playgroud)

我注意到没有这个函数的引用参数,复制构造函数被调用了两次,带有引用参数的wheree只被调用一次.仅调用一次复制构造函数而不是两次是使用引用参数的充分理由吗?

Uri*_*Uri 17

STL中的deque类应该保留传递给其push_back方法的元素的副本.这是一个复制构造函数的来源.

如果你在addMove()中删除了引用,你将首先获得参数的副本(因此一次调用复制构造函数),然后当你向后推时,你将获得第二个副本.

复制构造函数的双重调用是浪费的,因此引用是可取的.但是,您应该将addMove()的参数声明为const引用,以向调用者指示不会修改该元素.在这样的保证下(假设你不破坏它),可以安全地通过引用传递对象而不用担心并且不支付对象副本的惩罚.

  • 另一个重要原因(我说更重要的原因,IMO,如果你的代码已经被设计为不修改引用)通过引用传递给const,就是允许temporaries被接受作为参数(例如`action.AddMove(Move) (/*...*/));`如果`AddMove`采用`const Move&`,则有效,但如果仅采用`Move&`则无效 (2认同)