- 主题:被 std::function 坑一回
std::function 我把它当成指针看。。
就好像 shared_ptr<> 一样,你不需要用 && 或者 & 来优化。
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: 用到回调函数,为了支持虚函数,不用模板类型参数表示回调函数,而用了 std::function 包装。结果用 lambda 表达式传参的时候,有 move 捕获变量就编译失败了。代码类似这样:
: void api(std::function<void()>&& callback)
: {
: ...................
--
FROM 121.205.116.*
我觉得 api() 传 && 背离了函数指针这个语义啊。
如果你不传 &&,按说会报 p 不可复制的错误。
[p = std::move()]
这里,我觉得 [] 里面只能出现传值和 shared_ptr<>,其它的都不保险。这种回调通常是异步的,被捕获的变量跳出了当前生命周期。& 尤其不靠谱。
如果 std::function<> 被传给另外一个线程,经常也不保险。因为 [] 里面捕获的值可能会在另外一个线程里面析构。构造函数和析构函数不在同一个线程,危!
c++ lambda 坑略多。
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: 这个不本质
--
FROM 60.188.58.*
要是 lambda 语法返回的是 sharted_ptr<function<>> 或者 unique_ptr<function<>>,而不是现在的 function<> 就合理多了。
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: 我没研究过,为什么folly可以不要求可拷贝而std要求,不知道有什么考虑还是std开始没想到。如果是现有版本std库缺陷,以后增加提案放宽std::function的构造需求应该是最优解。
--
FROM 121.205.116.*