【发布时间】:2011-03-07 13:55:50
【问题描述】:
如果我有一个函数返回对我无法控制其源的类实例的引用,例如list<int>:
list<int>& f();
我想确保它的值只分配给另一个引用,例如:
list<int> &a_list = f();
如果用户改为这样做:
list<int> a_list = f(); // note: no '&', so the list is copied
我希望它是一个编译时错误,因为用户只会操作列表的副本而不是原始列表(这绝不是我的应用程序想要/想要的)。
有什么方法可以防止上面的复制构造和赋值(比如通过某种“包装器”类)?
理想情况下,如果要使用一些包装类,比如wrapper<T>,我希望它适用于任何类型的对象T。
是的,我知道对于我确实可以控制的类,我可以简单地将复制构造函数和赋值运算符private 设为:
class MyClass {
public:
// ...
private:
MyClass( MyClass const& );
MyClass operator=( MyClass const& );
};
禁止复制构造和赋值;但是,如上所示,我想为std::list 执行此操作,我不能简单地为其创建复制构造函数和赋值运算符private。
【问题讨论】:
-
@GMan:当然这是微不足道的,因为它是 1 个字符的错误;但是,很容易忘记键入“&”。如果您仍然不明白这一点,那么只需忽略问题并继续前进。
-
介意我问你为什么要这样做吗?
-
@Paul:但这就像说您需要一种方法来防止在打算使用
x += 1时执行x + 1。在“让我试着拯救你”而不是“你需要了解参考资料”的道路上,这是一个很大的痛苦。 -
@fingerprint211b:防止用户做他/她不应该做的事情,因为这是错误的事情(正如我最初所说的那样)。如果用户正在对列表的副本进行操作,那么显然他/她只对超出范围时将被销毁的副本进行更改。
-
@GMan:我不同意你的建议。这不是关于“学习如何编程”。例如,创建 auto_ptr
是为了帮助用户防止用户意外做错事。您可以在没有 auto_ptr 的情况下在 C++ 中完美编程,但您必须更加小心。我对您的 cmets 最大的问题是,您认为仅仅因为有人忘记输入“&”,他们就“不知道如何编程”。那是居高临下的,让你听起来很傲慢。仅供参考。
标签: c++ copy-constructor assignment-operator