如何定义一个函数来处理移动语义和复制语义?

Raz*_*ius 4 c++ move-semantics

假设我正在实现一个集合并且我想向它添加一个元素,例如。

template <typename T>
class MyCollection
{
    void add(const T& element);
};
Run Code Online (Sandbox Code Playgroud)

现在,由于添加元素通常意味着复制它,出于效率原因,使用以下版本的 add 也是有意义的void add(T&& element)。现在的问题是,显然这两个函数的代码是完全一样的,只是参数类型不同。目前我对 C++ 的掌握是有限的,但我想知道是否有一种简单而惯用的方法来编写add一次函数而无需重写两次?

bip*_*pll 6

事实上,这是通过定义一个重载来解决的:

void add(T element) {
    where_it_is_actually_stored.insert(std::move(element));
}
Run Code Online (Sandbox Code Playgroud)

接下来,根据您是添加左值、由移动的左值生成的右值还是临时对象,编译器将解析适当的构造函数,以便复制或移动您的值参数。