为什么auto_ptr的接口指定了两个类似复制构造函数的构造函数

Yog*_*ora 3 c++ stl auto-ptr

我正在浏览此链接auto_ptr上的auto_ptr文档 有些东西我无法完全理解为什么要这样做.在接口部分中,它的复制构造函数有两个声明

1)

auto_ptr(auto_ptr<X>&) throw (); 
Run Code Online (Sandbox Code Playgroud)

2)

template <class Y> 
     auto_ptr(auto_ptr<Y>&) throw(); 
Run Code Online (Sandbox Code Playgroud)

这是为了什么目的.

GMa*_*ckG 5

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

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

std::auto_ptr<derived> d(new derived);
std::auto_ptr<base> b(d); // converts 
Run Code Online (Sandbox Code Playgroud)

此外,你没有问,但你会发现复制构造函数是非const的.这是因为auto_ptr它将取得指针的所有权.在上面的示例中,b构建后,d保持不变.这使得auto_ptr不适合在容器中使用,因为它无法复制.

C++ 0x ditches 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
Run Code Online (Sandbox Code Playgroud)

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


CB *_*ley 5

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

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