在提供复制大对象的功能时,我是否需要提供一个接受右值的显式覆盖以受益于移动分配?
关于何时显式提供右值重写的大多数讨论都集中在构造函数和赋值运算符或返回值上。但是我还不太清楚它如何应用于复制/移动分配大对象。
考虑:
struct A{
//my owned data, any large object that implements move assignment
std::vector<std::string> myvec;
//pre-c++11, this would assign by copy
void Set(const std::vector<std::string>& vec){ myvec = vec; }
//c++11, explicitly move assign
void Set(std::vector<std::string>&& vec){ myvec = std::move(vec); }
};
A a;
a.Set(std::vector<std::string>({"hello","world"});
如果我用左值调用Set
,则将调用方法的第一个版本(const T&
,并且赋值将通过复制完成。在编写时,调用位于底部
Set
(T&&
)的第二版,因为该临时对象是一个右值。
我读到某个地方(现在找不到引用)const T&
可以绑定到右值。如果是这种情况,并且我的T
实现了移动分配运算符(就像std::vector
一样),第一个版本是否可以有效地进行rvalue的移动分配,从而使得T&&
的覆盖变得不必要?