对于启用了移动的类,这两者之间有区别吗?

struct Foo {
typedef std::vector<std::string> Vectype;
Vectype m_vec;
//this or
void bar(Vectype&& vec)
{
   m_vec = std::move(vec);
}
//that
void bar(Vectype vec)
{
    m_vec = std::move(vec);
}
};
int main()
{
   Vectype myvec{"alpha","beta","gamma"};
   Foo fool;
   fool.bar(std::move(myvec));
}

我的理解是,如果使用左值myvec,由于constVectype&不会绑定(bind),因此还需要引入Foo::bar()Vectype&&版本。除此之外,在rvalue的情况下,Foo::bar(Vectype)将使用move构造函数构造 vector ,或者更好的方法是看到vec为rvalue一起将拷贝全部删除(是吗?)。那么,是否有一个令人信服的理由不愿通过值声明而不是lvalue和rvalue重载呢?
(考虑到在任何情况下,我都需要将 vector 复制到成员变量。)

最佳答案

只要参数类型具有有效的move构造函数,那么按值传递函数就足够了(并等效),在这种情况下,对于std::vector而言,这是正确的。

否则,与使用pass-by-rvalue-ref函数相比,使用by-by-value函数可能会引入额外的复制构造。

请参阅相关问题https://stackoverflow.com/a/7587151/1190077的答案Do I need to overload methods accepting const lvalue reference for rvalue references explicitly?

10-07 16:27