C++11 C+;中lambda函数的作用域是什么+;11(代表)

C++11 C+;中lambda函数的作用域是什么+;11(代表),c++11,lambda,delegates,scope,C++11,Lambda,Delegates,Scope,我目前正在为我的C++11/OpenGL3.3项目开发一个GUI,我想为交互式GUI元素开发一种回调系统。我使用JS/jQuery,我非常喜欢为我想要的每个网站元素定义onMouseOver、onClick等就地方法的系统。我发现代理是我获得此类功能的最佳方式 示例代码: class Button { public: // ... // method (not needed in real-life, just to "show" it)

我目前正在为我的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 };
    // ...
}
class按钮{
公众:
// ...
//方法(现实生活中不需要,只是为了“展示”它)
void MouseOver(intx,inty){onMouseOver(this,x,y);}
//变数
std::mouseover函数;
}
空函数(…){
// ...
按钮t=新按钮(…);
t、 onMouseOver=[](按钮*this,intx,inty)->void{some_code_here};
// ...
}
主要问题:

但我担心的是我刚刚创建的onMouseOver函数的范围——那个指针在程序结束前是否有效?有人能解释一下在剩余的应用程序生命周期中,该函数会发生什么情况吗

其他问题:

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

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


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

2
lambda表达式的计算结果为
prvalue
临时值(12.2)此临时对象称为闭包对象

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

  • 因此,根据上面的说明,Lambda函数的作用域是function
    someFunction()
    的作用域

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


该指针在程序结束前有效吗


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

  • 因此,只要包含它的
    按钮
    类对象有效,
    onMouseOver
    及其内容就有效


@Ripper Yes,将lambda视为未命名的函数对象,lambda的本地实例在成员变量中移动,因此只要保存它的对象是“活动的”,它的“活动的”。我删除了第一条注释,因为答案的编辑部分涵盖了我的问题。谢谢你的专业回答!:)最后一个问题-std::function是否足够好(快速)以在本项目中使用它?或者我应该寻找一个“超快速超大C++代表”吗?@开普尔我不是真正的专家(即C++代表),但是有一些关于我最近知道的主题的好的在线文章。