通过值或rvalue-ref传递

hur*_*ter 10 c++ rvalue-reference c++11

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

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));
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果你使用左值,myvec你还需要引入const Vectype&版本,Foo::bar()因为Vectype&&不会绑定.除此之外,在rvalue情况下,Foo::bar(Vectype)将使用移动构造函数构造向量或更好地将副本全部放在一起,看到vec是一个右值(是吗?).那么有没有令人信服的理由不通过值声明而不是左值和右值超载?(考虑到我需要在任何情况下将向量复制到成员变量.)

asc*_*ler 5

The pass-by-value version allows an lvalue argument and makes a copy of it. The rvalue-reference version can't be called with an lvalue argument.

使用const Type&时,您无需更改或抄袭的说法,通过使用按值当你想要一个修改的值,但不关心你如何得到它,并使用Type&Type&&重载当你想要的东西稍有不同的情况发生取决于具体情况.


Hug*_*ues 3

只要参数类型具有高效的移动构造函数,按值传递函数就足够了(并且等效),在本例中对于std::vector.

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

请参阅相关问题的答案/sf/answers/531100601/我是否需要显式重载接受 const 左值引用作为右值引用的方法?