如何使用“函数调用运算符”将“右值”类型加载到我的对象中?

How do I use the `Function Call Operator` to load `rvalue` types to my object?

我有一个 class 这样的:

template<typename T>
class MyClass
{
    public:
        // ...
              T && operator()(uint64_t i, uint64_t j);  // I want to add a member function like this.
              T &  operator()(uint64_t i, uint64_t j);
        const T &  operator()(uint64_t i, uint64_t j) const;
        // ...
};

当我修改代码时,我意识到每次尝试将对象设置到 (i,j) 位置时都会复制 T 类型的存储对象。如果可能的话,我想使用移动语义并避免这种不必要的复制吗?是否可以像上面的代码一样通过添加第三个运算符来解决这个问题?

我的目标是在代码中访问这样的 MyClass 实例:

MyClass<Element> myclass;
// ...
Element element;                        // 'Element' is movable.
// ...
myclass(2, 3) = std::move(element);     // 'element' is no longer needed, it can be moved.

我该怎么做?

首先你不能基于return类型重载。但是,这不是您的问题,因为您不需要下标运算符的额外重载。

为了避免不必要的复制,并且由于 class Element 对象是可移动的,您可以使用 std::swap 而不是直接赋值。

std::swap(myclass(2, 3), element);

因为 C++11 std::swap 避免了不必要的复制,因为它使用移动语义。