- 主题:被 std::function 坑一回
确实是有很多考虑不周到的地方,学艺不精。
move就是传递生存期,这个从语义上预期是要支持的
【 在 hgoldfish 的大作中提到: 】
: 我觉得 api() 传 && 背离了函数指针这个语义啊。
:
: 如果你不传 &&,按说会报 p 不可复制的错误。
: ...................
--
FROM 220.249.162.*
你这么一说,是不是写个functor就行了,结构体的构造函数接unique_ptr。
然后把unique _ptr脱了,自己在析构里释放。
【 在 ilovecpp 的大作中提到: 】
: 不好。最后没调用lambda,就leak。拷贝lambda并且都调用了,就double free。
: auto up = std::make_unique<std::string>("hello");
: if (0) {
: ...................
--
FROM 117.39.224.*
你这样的functor一样是不可拷贝,和楼主最早写的并无差别。
有的functor就是不可拷贝,std::function不该要求可拷贝。
【 在 DoorWay 的大作中提到: 】
: 你这么一说,是不是写个functor就行了,结构体的构造函数接unique_ptr。
: 然后把unique _ptr脱了,自己在析构里释放。
--
FROM 58.37.58.*
我把入参的unique_ptr脱了壳,成员变量存裸指针,不行吗?
我明天试试。
【 在 ilovecpp 的大作中提到: 】
: 你这样的functor一样是不可拷贝,和楼主最早写的并无差别。
: 有的functor就是不可拷贝,std::function不该要求可拷贝。
--
FROM 1.85.207.*
当然可以,不过你怎么实现copy ctor?
【 在 DoorWay 的大作中提到: 】
: 我把入参的unique_ptr脱了壳,成员变量存裸指针,不行吗?
: 我明天试试。
--
FROM 58.37.58.*
我看到stackoverflow里面还有用shared_ptr包一层unique_ptr的处理方法,我觉得很魔道…他这个思路无非解出来就这样了吧
【 在 ilovecpp 的大作中提到: 】
: 当然可以,不过你怎么实现copy ctor?
:
: 【 在 DoorWay 的大作中提到: 】
: ...................
--
修改:milksea FROM 120.36.49.*
FROM 120.36.49.*
好问题!所以一开始,楼主的版本,应该应该传shared_ptr
不然,照我的思路下去,就是把functor的copy ctor实现成蹩脚的shared_ptr版本。
如果不是在unique_ptr持有的类型T上,增加clone函数,实现virtual ctor 哈哈
【 在 ilovecpp 的大作中提到: 】
: 当然可以,不过你怎么实现copy ctor?
--
FROM 1.85.207.*
我没研究过,为什么folly可以不要求可拷贝而std要求,不知道有什么考虑还是std开始没想到。如果是现有版本std库缺陷,以后增加提案放宽std::function的构造需求应该是最优解。
【 在 ilovecpp 的大作中提到: 】
: 你这样的functor一样是不可拷贝,和楼主最早写的并无差别。
: 有的functor就是不可拷贝,std::function不该要求可拷贝。
:
: ...................
--
FROM 120.36.49.*
哦,是的,大意了,没注意到这个是call()而不是直接使用lambda,确实危险。
【 在 ilovecpp 的大作中提到: 】
: 不好。最后没调用lambda,就leak。拷贝lambda并且都调用了,就double free。
: auto up = std::make_unique<std::string>("hello");
: if (0) {
: ...................
--
FROM 222.129.55.*
要是 lambda 语法返回的是 sharted_ptr<function<>> 或者 unique_ptr<function<>>,而不是现在的 function<> 就合理多了。
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: 我没研究过,为什么folly可以不要求可拷贝而std要求,不知道有什么考虑还是std开始没想到。如果是现有版本std库缺陷,以后增加提案放宽std::function的构造需求应该是最优解。
--
FROM 121.205.116.*