从C ++ 11开始,shared_ptr或unique_ptr构造函数可以有两个参数,第二个是删除器。 我对这个删除器的定义感兴趣。
有些reference仅提及删除者的返回类型:
unique_ptr( pointer p, /* see below */ d1 ); //(3) (since C++11)
unique_ptr( pointer p, /* see below */ d2 ); //(4) (since C++11)
3-4)构造一个拥有p的std :: unique_ptr对象,用p初始化存储的指针并初始化一个删除器D,如下所示(取决于D是否为引用类型)
a)如果D是非参考类型A,则签名为:
unique_ptr(pointer p, const A& d); //(requires that Deleter is nothrow-CopyConstructible)
unique_ptr(pointer p, A&& d); // (requires that Deleter is nothrow-MoveConstructible)
b)如果D是左值参考类型A&,那么签名是:
unique_ptr(pointer p, A& d);
unique_ptr(pointer p, A&& d);
c)如果D是左值引用类型const A&,那么签名是:
unique_ptr(pointer p, const A& d);
unique_ptr(pointer p, const A&& d);
但是,参考Stanley B. Lippman's "C++ Primer", 5th edition,似乎有更多限制:在第12章动态内存中,第12.1节,第469页:
void end_connection(connection *p) { disconnect(*p); }
void f(destination &d /* other parameters */)
{
connection c = connect(&d);
shared_ptr<connection> p(&c, end_connection);
// use the connection
// when f exits, even if by an exception, the connection will be properly closed
}
这里end_connection是删除器,但是,有一个隐含的要求,即删除器的第一个参数(即&#34; * p&#34;),以及shared_ptr构造函数的第一个参数(即&#34; c&#34;),具有相同的类型(即&#34;连接&#34;)。
这个观察是真的吗?如果需要更严格地定义删除器,签名会更复杂吗?
在Alan Stokes的回复
之后更新的删除者
shared_ptr<A>
可以定义为
function<B (A *)> deleter;
,其中function是&#34; functional&#34;中定义的模板。标题,B可以是任何东西,因为删除器的返回类型无关紧要。
所以
的构造函数shared_ptr<A>
可以写成
shared_ptr<A> p(A *, function<B (A *)> )
我想&#34;概念精简&#34;因任意选择B而被引入。
答案 0 :(得分:1)
您引用的参考资料中有很多信息:
“对象被破坏......通过调用Deleter(ptr)。”
“Deleter必须...可以使用unique_ptr :: pointer类型的参数调用。”
这些约束不是由类型系统强制执行的,因此在技术上不是签名的一部分,而是指定为unique_ptr
的要求。