c++ - 使用成员在类中创建 lambda 表达式
问题描述
我正在尝试创建一个基于类成员返回 lambda 表达式的类成员函数。为简化起见,我创建了此示例代码。
#include <functional>
class A
{
private:
int value;
public:
// Default constructor
A()
: value(0)
{ };
// Constructor
A(int value)
: value(value)
{ };
// Returns a lambda expression
std::function<int()> get_value()
{
return [](){ return value; };
// Gives error: "error: 'this' was not captured for this lambda function"
}
};
我知道对于这个实现,它可以更容易地编程(离开 lambda 表达式),但我认为解释和理解这个概念很好。
问题:如何在类成员 lambda 表达式中使用类成员变量?换句话说:如何在类的 lambda 函数中捕获“this”?
解决方案
如果要捕获this
,则应捕获this
:
return [this](){ return value; };
然而,这伴随着一个常见的警告,即this
lambda 捕获的内容只能在this
活着的情况下使用。
附言
我知道对于这个实现,它可以更容易地编程(离开 lambda 表达式),[...]
如果你想要一个返回你的可调用对象,value
那么A
如果不使用 lambda 表达式,我将不知道如何(轻松地)做到这一点。我宁愿在你的设计中看到问题。如上所述,调用者需要谨慎,std::function
只要A
对象还活着,就只使用返回的值。有一个不明显的依赖关系,效果是你A
很容易被错误地使用:
auto f = A{}.get_value();
这会创建一个破碎的std::function<int()>
. 坦率地说,您的代码就是我所说的“封装非常错误”。当然,您的代码只是一个示例,但请考虑以下示例:
struct A { int value = 0; };
int main() {
A a;
auto f = [&](){ return a.value; };
}
这里调用者(即 的用户)在其代码中显式地A
具有依赖关系(的可用性f
取决于 的生命周期)。a
推荐阅读
- sql - 为什么这个 SQL 代码的行为是这样的。不应该抛出编译错误吗?
- android - SVG 图像未显示在简单的 android cordova 表中
- webview - webview 中的视频在第二次运行时不起作用
- javascript - 多次调用另一个js文件的generator函数并与generators同步运行
- node.js - 如何检查 ExpressJS server.js 中的 React 路由?
- python-3.x - Python:总结列表中所有具有相同teamA和teamB的dicts的score1和score2字段?
- c - 根据条件移动矩阵列
- oracle - Artifactory 可以使用 Oracle RAC 吗?如果是,那么支持哪些 Oracle 版本和版本?
- asp.net-mvc - MVC 在索引视图中更改日期格式
- c++ - 错误:没有用于初始化 ... 和 mexFunction 的匹配构造函数