【问题标题】:Using lambdas in local scope in c++在 C++ 的本地范围内使用 lambda
【发布时间】:2020-07-27 17:18:33
【问题描述】:

可以像这样在本地范围内声明 lambdas:

// reference to method is just a call back function. 
void(*referenceToSomeMethod)();

// store call back function
void foo(void(*pointerToMethod)())
{
    referenceToSomeMethod = pointerToMethod; // save reference to method    
}

int main()
{

    referenceToSomeMethod = nullptr;

    if (1 == 1)
    {
        // use of lambda on local scope
        foo([]() {
            printf("Executing callback function\n");
        });


    } // leaving scope lambda may not longer be valid?

    // simulate some work
    Sleep(10000);

    if (referenceToSomeMethod != nullptr)
        referenceToSomeMethod(); // execute lambda
}

在现实生活中,我会等到事件发生才触发回调方法。我可以冒回调指针指向不再存在的函数的风险吗?

我知道这适用于 c# 和其他具有垃圾收集器的语言。但这适用于 c++ 吗?

【问题讨论】:

  • this 回答你的问题了吗?
  • 只要没有捕获。
  • 为什么不使用std::function<void()> 并通过右值引用传递。从而允许您捕获 lambda 并将其移动到位?因此,您可以保留任何捕获的参数。
  • 我不能使用 std::function 我正在为微控制器 (arduino) 创建一个类库。但是是的,我必须将参数作为参考存储在其他地方,这是相同的想法。

标签: c++ lambda callback


【解决方案1】:

带空括号的 Lambda 与函数指针等价,并以相同的方式按值复制。回答是。

【讨论】:

  • 如果我的 lambda 按值接收参数,我猜这也是正确的?感谢@super的帮助
  • 没有。创建一个本地对象,其中包含捕获的值,然后超出范围。
  • 为了安全起见最好在全局范围内声明回调函数正确?
  • @super。我不知道带空括号的 lambda 等效于函数指针。你有这个参考吗(上面的代码有效,所以它似乎是真的(这让我很惊讶))。
  • @MartinYork 这个:stackoverflow.com/a/28746827/2378102。此外,您可以在捕获 lambda 的前面加上一个 + 来获得一些魔法,看看吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多