Для перемещенных классов есть разница между этими двумя?
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));
}
Я понимаю, что если вы используете lvalue myvec
, вам также необходимо ввести const
Vectype&
версию Foo::bar()
, так как Vectype&&
не будет связываться. В стороне, в случае с rvalue, Foo::bar(Vectype)
построит вектор, используя конструктор перемещения или лучше, но все же вернет копию вместе, увидев, что vec является rvalue (не так ли?). Таким образом, есть ли веская причина не предпочитать вместо объявления lvalue и rvalue объявление значения?
(Рассмотрим, что мне нужно скопировать вектор в переменную-член в любом случае.)