作为包含存储在 vector 中的 auto_ptr 的 Class的后续,我相信未说明的结论是可以使用具有auto_ptr
成员的类作为容器元素,只要复制构造和复制分配都是用户定义的(以免调用auto_ptr
s 复制构造函数和复制赋值)。这有什么违反标准库要求的吗?
请告诉我以下内容是否有问题,因为我想开始习惯性地这样做:
#include <memory>
#include <algorithm>
class Y { /* ... */ };
class Z : public Y { /* ... */ };
class X {
public:
X() : ap(new Z()) {}
X(const X& other) : ap(other.ap->clone()) {}
X& operator=(X other) { swap(other); return *this; } // any problem with swap?
void swap(X& other) { std::swap(ap, other.ap); }
// note no destructor necessary
private:
std::auto_ptr<Y> ap; // Y provides clone()
};
请注意,我意识到的一件事是,使用这种方法,Y
' 类定义必须在X
' 定义的范围内(而不是在使用“原始”指针时向前声明Y
)。这是因为当auto_ptr
被实例化时,它的析构函数必须在 a 上调用 delete Y
,因此Y
不能是不完整的类型。我想在类X
管理多个资源(有多个auto_ptr
成员)的情况下,这必须与 RAII 的值进行权衡。对此有什么想法吗?
我认为这项技术总体上很棒,可以消除可能必须构造/破坏/复制潜在多个资源(单一责任主体)的类的许多棘手代码。我只是想知道是否auto_ptr
可以达到目的,或者由于某些微妙的语言/标准库要求而在这里不起作用。
请注意,我知道其他类型的智能指针,但我正在实现一个库接口,我不想对我的客户强加任何对 Boost 或 TR1 的要求。任何关于一般使用的讲座auto_ptr
都将被否决!