在 C ++ Primer 5th 中,我见过这样的事情:
shared_ptr<T> p(p2,d)
p是shared_ptr p2
的副本,除了p使用p使用可调用对象d代替delete
但是当我测试它时:
#include <memory>
#include <iostream>
class DebugDelete {
public:
DebugDelete(std::ostream &o = std::cerr) : os(o) {}
template <typename T> void operator()(T *p) const
{
os << "delete unique_ptr" << std::endl;
delete p;
}
private:
std::ostream &os;
};
int main()
{
std::shared_ptr<int> sptr, sptr1(sptr, DebugDelete());
}
我引用的内容似乎不对,sptr1(sptr, DebugDelete())
不起作用,但sptr1(new int(42), DebugDelete())
效果不错。
允许使用shared_ptr
和删除器来构建{em> C ++ Primer 5th 中的share_ptr
吗?
感谢。
答案 0 :(得分:2)
对于编译的情况:
std::shared_ptr<int> sptr, sptr1(new int(42), DebugDelete());
它使用了第四个构造函数:
template< class Y, class Deleter > shared_ptr( Y* ptr, Deleter d );
(4)
对于另一个案例,你提到:
std::shared_ptr<int> sptr, sptr1(sptr, DebugDelete());
它无法使用此构造函数,因为您没有传递指针,而是传递了不同的shared_ptr
对象。
进一步向下列表,没有任何构造函数匹配此处的参数,因此最终会出现编译错误。这段代码不符合标准,这使我相信它与书中的内容不同。