3

我正在浏览此链接上的 auto_ptr 文档auto_ptr 有一些事情我无法完全理解为什么会这样做。在接口部分有两个声明它的复制构造函数

1)

auto_ptr(auto_ptr<X>&) throw (); 

2)

template <class Y> 
     auto_ptr(auto_ptr<Y>&) throw(); 

这是为了什么目的。

4

2 回答 2

5

如果您可以隐式转换指针,它就在那里:

struct base {};
struct derived : base {};

std::auto_ptr<derived> d(new derived);
std::auto_ptr<base> b(d); // converts 

此外,您没有问,但您会注意到复制构造函数是非常量的。这是因为auto_ptr将获得指针的所有权。在上面的示例中,在b构造之后,d什么也不保留。这使得auto_ptr不适合在容器中使用,因为它不能被复制。

C++0x 抛弃auto_ptr并制作了一个名为unique_ptr. 该指针具有相同的目标,但由于移动语义而正确完成了它们。也就是说,虽然它不能被复制,但它可以“移动”所有权:

std::unique_ptr<derived> d(new derived);

std::unique_ptr<base> b(d); // nope, cannot be copied
std::unique_ptr<base> b(std::move(d)); // but can be moved

unique_ptr适合在容器中使用,因为它们不再复制它们的值,而是移动它们。

于 2010-01-23T01:15:30.320 回答
5

第一个复制构造函数,然后第二个是auto_ptr带有其他模板参数的模板化构造函数。

如果不希望编译器生成一个,则实现必须提供一个非模板复制构造函数。这是因为可以用作复制构造函数的模板化构造函数不会抑制编译器生成的构造函数,并且编译器生成的构造函数由于不是模板而总是更适合复制构造。

于 2010-01-23T01:16:46.183 回答