C++ 对已禁用复制构造函数/赋值的对象的引用

C++ 对已禁用复制构造函数/赋值的对象的引用,c++,c++11,reference,C++,C++11,Reference,在我的应用程序中,我有一个对象列表。因为我必须只有一个实例,所以我禁用了复制构造函数和赋值运算符。仍然允许移动对象。但是,由于我对对象执行各种操作,我需要存储指向其中一个对象的指针。在此之前,我使用了指针,但现在我想使用引用 由于某些原因,我无法重新分配引用。错误: error: overload resolution selected deleted operator '=' candidate function has been explicitly deleted 演示此问题的示例代码:

在我的应用程序中,我有一个对象列表。因为我必须只有一个实例,所以我禁用了复制构造函数和赋值运算符。仍然允许移动对象。但是,由于我对对象执行各种操作,我需要存储指向其中一个对象的指针。在此之前,我使用了指针,但现在我想使用引用


由于某些原因,我无法重新分配引用。错误:

error: overload resolution selected deleted operator '='
candidate function has been explicitly deleted
演示此问题的示例代码:

包括 类项目 { 公众: 项{n=++项::计数器;} Itemconst Item&&other{n=std::moveother.n;} itemcont Item&other=删除; 项目和操作员=常量项目和其他=删除; int Get{return n;} 私人: int n; 静态整数计数器; }; int Item::counter=0; int main { 项目1; 项目12; 项目*p=&i1; printf%d\n,p->Get; p=&i2; printf%d\n,p->Get; 项目&r=i1; printf%d\n,r.Get; r=i2;//这里我得到了错误 printf%d\n,r.Get; 返回0; } 好的,如果我在这样的事情上出错,我可以理解:

第i3项=第i2项; i、 e.如果真的有任务。但这里我只想存储对对象的引用,而不是将其分配或复制到另一个对象


我的问题是如何存储一个引用的非复制对象,避免指针?C++引用中的

< p>不能回溯。这是什么意思?这意味着一旦创建了引用,就不能更改此引用所引用的对象。它具有重大意义-例如,此代码:

Item i1;
Item i2;
Item &r = i1;
r = i2; 
逻辑上与此等效:

Item i1;
Item i2;
i1 = i2; 
现在应该可以理解为什么编译器在赋值运算符上有问题了。该怎么办?您可以使用您想要的-可重新绑定引用类型:

Item i1;
Item i2;
auto r = std::ref(i1);
r = std::ref(i2); 

在C++引用中,p>不是可回溯的。这是什么意思?这意味着一旦创建了引用,就不能更改此引用所引用的对象。它具有重大意义-例如,此代码:

Item i1;
Item i2;
Item &r = i1;
r = i2; 
逻辑上与此等效:

Item i1;
Item i2;
i1 = i2; 
现在应该可以理解为什么编译器在赋值运算符上有问题了。该怎么办?您可以使用您想要的-可重新绑定引用类型:

Item i1;
Item i2;
auto r = std::ref(i1);
r = std::ref(i2); 

由于某些原因,我无法重新分配引用。原因是语言不允许这样做。如果您希望该引用重新绑定到另一个对象,那么语言就不是这样工作的。一旦在需要的初始化时绑定,引用就不能解除绑定,但如果不小心,它可能会悬空。在代码中,r=i2;与i1=i2同义;,你会发现这也不会编译。明确定义复制构造函数/赋值操作符可以解决这个问题,但这不是我想要的。至于我,当你禁用处理,然后你不能存储对对象的引用时,会产生一些奇怪和意外的副作用,这绝对不是一回事。如果你想更改指向哪个对象,你需要使用指针,引用只能指向它们第一次初始化时使用的对象。显然,您可以拥有一个引用。你创造了一个。项目&r=i1;但不能像使用指针一样将该引用重新绑定到其他对象。这不是语言的工作方式。顺便说一句,你对第i3项的评估=i2;就像真正的赋值一样——也不准确。那不是赋值,那是。由于某种原因,我不能重新赋值引用。原因是语言不允许这样做。如果您希望该引用重新绑定到另一个对象,那么语言就不是这样工作的。一旦在需要的初始化时绑定,引用就不能解除绑定,但如果不小心,它可能会悬空。在代码中,r=i2;与i1=i2同义;,你会发现这也不会编译。明确定义复制构造函数/赋值操作符可以解决这个问题,但这不是我想要的。至于我,当你禁用处理,然后你不能存储对对象的引用时,会产生一些奇怪和意外的副作用,这绝对不是一回事。如果你想更改指向哪个对象,你需要使用指针,引用只能指向它们第一次初始化时使用的对象。显然,您可以拥有一个引用。你创造了一个。项目&r=i1;但不能像使用指针一样将该引用重新绑定到其他对象。这不是语言的工作方式。顺便说一句,你对第i3项的评估=i2;就像真正的赋值一样——也不准确。这不是作业,这是。谢谢@bartop,这是一个很好的解决方案!不幸的是,我对此一无所知。谢谢@bartop,这是一个很好的解决方案!不幸的是,我对此一无所知。