标签: capture-list

将unique_ptr移至lambda时,为什么无法调用reset?

当移动std::unique_ptr到拉姆达,这是不可能的调用reset()就可以了,因为它似乎是常量,则:

error C2662: void std::unique_ptr<int,std::default_delete<_Ty>>::reset(int *) noexcept': cannot convert 'this' pointer from 'const std::unique_ptr<int,std::default_delete<_Ty>>' to 'std::unique_ptr<int,std::default_delete<_Ty>> &
Run Code Online (Sandbox Code Playgroud)
#include <memory>
int main()
{
    auto u = std::unique_ptr<int>();
    auto l = [v = std::move(u)]{
        v.reset(); // this doesn't compile
    };
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么会这样?
  2. 是否可以通过std::unique_ptr允许reset()在lambda(使用C ++ 17或更高版本)中调用的另一种方式捕获?

c++ lambda unique-ptr c++11 capture-list

34
推荐指数
4
解决办法
1632
查看次数

在嵌套函数中自我捕获

有了闭包,我通常将[弱自我]附加到我的捕获列表上,然后对self进行空检查:

func myInstanceMethod()
{
    let myClosure =
    {
       [weak self] (result : Bool) in
       if let this = self
       { 
           this.anotherInstanceMethod()
       }
    }   

    functionExpectingClosure(myClosure)
}
Run Code Online (Sandbox Code Playgroud)

如果我使用嵌套函数代替闭包,我该如何对self执行null检查(或者检查甚至是必要的......或者使用像这样的嵌套函数甚至是好的做法)即

func myInstanceMethod()
{
    func nestedFunction(result : Bool)
    {
        anotherInstanceMethod()
    }

    functionExpectingClosure(nestedFunction)
}
Run Code Online (Sandbox Code Playgroud)

memory-management weak-references nested-function swift capture-list

18
推荐指数
1
解决办法
3447
查看次数

我怎样才能找到所有的闭包?

在闭包中引用它时,我们完全忘记了捕获 self 及其属性。(注意:编译器没有警告我们。)现在我们的应用程序充满了强引用循环。为了修复它们,我们必须将捕获列表一一添加到每个闭包中。

我们如何才能找到所有这些?我想搜索,in但结果太多,包括评论,循环。

好的老目标 C 会帮助我搜索^. 它会警告我们...

closures swift capture-list strong-reference-cycle

5
推荐指数
0
解决办法
456
查看次数