【问题标题】:What is a scope for lambda function in C++11 (delegates)C++11 中 lambda 函数的作用域是什么(代表)
【发布时间】:2014-06-30 21:10:37
【问题描述】:

我目前正在为我的 C++11/OpenGL3.3 项目开发 GUI,并且我正在考虑为交互式 GUI 元素制作某种回调系统。我使用了 JS/jQuery,我真的很喜欢为我想要的每个网站元素定义就地方法的系统,例如 onMouseOver、onClick。我发现委托是我获得此类功能的最佳方式。

示例代码:

class Button {
    public:
        // ...

        // method (not needed in real-life, just to "show" it)
        void MouseOver(int x, int y) { onMouseOver(this, x, y); }

        // variable
        std::function<void(Button*, int, int)> onMouseOver;
}

void someFunction(...) {
    // ...
    Button t = new Button(...);
    t.onMouseOver = [](Button* this, int x, int y) -> void { some_code_here };
    // ...
}

主要问题:

但我担心我刚刚创建的特定 onMouseOver 函数的范围 - 该指针在程序结束之前是否有效?有人能解释一下该函数在剩余的应用程序生命周期中究竟会发生什么吗?

其他问题:

有没有更好的方法来做这样的事情?更简单/更高效?我见过很多“不可能的快”——真的有那么慢吗?

【问题讨论】:

    标签: c++11 lambda delegates scope


    【解决方案1】:

    C++11 中 lambda 函数的作用域是什么?


    根据标准§ 5.1.2/2 & 3 Lambda 表达式 [expr.prim.lambda]

    2 对 lambda 表达式的求值导致 prvalue 临时 (12.2)。 这个临时对象称为闭包对象

    3 闭包类型在最小的块作用域、类作用域或命名空间中声明 包含相应 lambda 表达式的作用域。

    • 所以根据上面的说法,你的 Lambda 函数的作用域就是函数someFunction() 的作用域。

    • 但是,由于您将其分配给 onMouseOver 成员变量,它的移动构造函数被调用,因此 onMouseOver 将保存您的 Lambda 的移动实例。


    该指针在程序结束前是否有效?


    • 类模板std::function 是一个通用的多态函数包装器(即函数对象)。 std::function 的实例可以存储、复制和调用任何可调用目标(例如,函数、lambda 表达式、绑定表达式或其他函数对象)。

    • 因此,onMouseOver 及其内容将有效,只要包含它的 Button 类对象有效。

    【讨论】:

    • @Ripper 是的,将 lambdas 视为未命名的函数对象,lambda 的本地实例在成员变量中移动,因此只要其持有它的对象“活着”,它就“活着”。
    • 我删除了第一条评论,因为答案的编辑部分涵盖了我的问题。谢谢专业解答! :) 最后一个问题 - std::function 是否足够好(快)可以在这个项目中使用它?还是我应该寻找“超快速超大型 C++ 代表”之一?
    • @RippeR 我不是这方面的专家(即 C++ 代表),但是我知道最近有一些关于该主题的优秀在线文章是 blog.coldflake.com/posts/…
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多