我如何使用“函数调用操作符”来加载“右值”类型到我的对象
How do I use the `Function Call Operator` to load `rvalue` types to my object?
我有一个这样的类:
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.
我该怎么做?
首先,不能根据返回类型重载。但是,这不是您的问题,因为您不需要额外重载下标操作符。
为了避免不必要的复制,并且由于class Element
对象是可移动的,您可以使用std::swap
来代替直接赋值。
std::swap(myclass(2, 3), element);
自c++ 11起,std::swap
避免了不必要的复制,因为它使用了move语义。
相关文章:
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 为什么我总是收到此错误:从类型为"农场动物"的右值初始化类型的非常量引用无效|
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 无法使用 'const Node *' 类型的右值初始化 'Node *' 类型的变量
- 为什么作为返回类型的右值引用不能初始化非常量引用?
- 重载运算符返回什么类型的值(对于用户定义的类型):右值还是左值?
- 为什么右值引用类型的模板参数可以绑定到左值类型?
- 包含仅移动类型的类的构造函数应通过引用还是通过右值引用接收仅移动类型?
- 当函数采用右值引用时,函数中该变量的类型是什么?
- 对类型"项 *const"的引用无法绑定到类型为"const 项 *"的右值
- 无法将类型为"类名 &"的非常量左值引用绑定到类型为"类名"的右值
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 类类型的左值到右值转换:是否涉及复制?
- 为什么'std::p air'允许使用用户定义的已删除移动构造函数从类类型的右值初始化?
- 无法将类型"int&"的非常量左值引用绑定到类型为"int"的右值