什么是C ++删除器的签名?

时间:2014-11-22 07:43:46

标签: c++ delegates signature

从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而被引入。

1 个答案:

答案 0 :(得分:1)

您引用的参考资料中有很多信息:

“对象被破坏......通过调用Deleter(ptr)。”

“Deleter必须...可以使用unique_ptr :: pointer类型的参数调用。”

这些约束不是由类型系统强制执行的,因此在技术上不是签名的一部分,而是指定为unique_ptr的要求。