针对可拷贝的形参,在移动成本低并且一定会被拷贝的前提下,考虑将其按值传递
有些函数的形参本来就是打算拿来复制的。成员函数addName
可能会将其形参复制入其私有容器。这样的函数应该针对左值实施拷贝,针对右值实参实施移动。
class Widget{
public:
void addName(const std::string& newName)
{ names.push_back(newName); }
void addName(std::string&& newName)
{ names.push_back(std::move(newName)); }
};
这样写也没有错,但是要求撰写本质上在做同一件事的两个函数。这么一来,就需要撰写两份函数声明,两份函数实现,两份函数文档,两份函数维护工作量。
另一种方法是把addName
写成接受万能引用的函数模板。
class Widget{
public:
template<typename T> //接受左值
void addName(T&& newName) //也接受右值
{ //对左值实施拷贝
names.push_back(std::forward<T>(newName)); //对右值实施移动
}
};
这减少了你所要着手处理的源代码数量,但是万能引用的使用会导致其他方面的复杂性。作为模板,addName
的实现通常必须置于头文件中。它可