gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:33:55 24 4
gpt4 key购买 nike

自 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是删除器,但是有一个隐含的要求,删除器的第一个参数(即“*p”)和shared_ptr构造函数的第一个参数(即“c”)具有相同的类型(即“连接”)。

这个观察是真的吗?如果删除者需要更严格的定义,签名会更复杂吗?


Alan Stokes 回复后更新

删除器

shared_ptr<A> 

可以定义为

function<B (A *)> deleter;

,其中 function 是在“functional” header 中定义的模板,B 可以是任何东西,因为删除器的返回类型无关紧要。

所以

的构造函数
shared_ptr<A>

可以写成

shared_ptr<A> p(A *, function<B (A *)> )

我想引入“concept lite”是由于B的任意选择。

最佳答案

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

“对象被销毁......通过调用 Deleter(ptr)。”

“删除器必须是……可以用 unique_ptr::pointer 类型的参数调用”。

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

关于c++ - C++删除器的签名是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27075222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com