C++11 C+;中lambda函数的作用域是什么+;11(代表)
我目前正在为我的C++11/OpenGL3.3项目开发一个GUI,我想为交互式GUI元素开发一种回调系统。我使用JS/jQuery,我非常喜欢为我想要的每个网站元素定义onMouseOver、onClick等就地方法的系统。我发现代理是我获得此类功能的最佳方式 示例代码: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)
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
将保存Lambda的移动实例onMouseOver
该指针在程序结束前有效吗
- 类模板
是一个通用多态函数包装器(即函数对象)。std::function
的实例可以存储、复制和调用任何可调用的目标(例如函数、lambda表达式、绑定表达式或其他函数对象)std::function
- 因此,只要包含它的
类对象有效,按钮
及其内容就有效onMouseOver