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

How to define a function to work with move semantics and copy semantics?

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

template <typename T>
class MyCollection
{
    void add(const T& element);
};

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

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

void add(T element) {
    where_it_is_actually_stored.insert(std::move(element));
}

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

我认为最通用的解决方案实际上是这样的。这是标准库提供的,所以我想这就是 "idiomatic".

template<typename T>
struct my_collection {
    template<typename... Args>
    void emplace(Args&&... args) {
        // construct the T object directly in its place out of std::forward<Args>(args)...
    }
};