Dla klas z włączonym przeniesieniem istnieje różnica między tymi dwoma elementami?Przekaż wartość lub rvalue-ref
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));
}
moim rozumieniu jest to, że jeśli używasz lwartość myvec
również zobowiązane do wprowadzenia const Vectype&
wersję Foo::bar()
od Vectype&&
nie zwiąże. Poza tym, w przypadku rvalue, Foo::bar(Vectype)
skonstruuje wektor za pomocą konstruktora ruchu lub jeszcze lepiej zlikwiduje kopię razem, widząc, że vec jest rwartością (czyżby?). Czy istnieje zatem nieodparty powód, aby nie preferować deklaracji wartości zamiast przeciążeń lwartości i rwartości? (Rozważ, muszę w każdym przypadku skopiować wektor do zmiennej składowej).
przed jakimkolwiek pedanterią Wiem, że przeciążenia są niejednoznaczne. –