我正在尝试捕捉this
lambda 函数中的指针,用作方法的默认参数。
我的目标是从 lambda 中调用此类的方法,这需要捕获this
指针。
但是,以下代码会导致错误:
错误 C3639:作为默认参数一部分的 lambda 只能有一个 init-capture
克服此限制的常见解决方案是什么?
#include <functional>
class A{
public:
void B(std::function<void()> a = [this](){}); //error C3639: a lambda that is part of a default argument can only have an init-capture.
};
线路的问题...
void B(std::function<void()> a = [this](){});
...是 lambda 表达式是函数形参的默认实参。
函数参数是在调用站点创建的,并且没有this
可以在那时捕获。
C++标准禁止this
在默认参数中:
[ Note: 关键字this
不得出现在成员函数的默认参数中;看[expr.prim.this].
[ Example:
class A {
void f(A* p = this) { } // error
};
— 结束示例 ] — 结束说明 ]
- [dcl.fct.default] p8
这只是一个注释,但对于 lambda 来说也是如此,因为:
A lambda 表达式出现在默认参数中不应隐式或显式捕获任何实体。
- [expr.prim.lambda.capture] p9
理由this
不能在默认参数中使用
函数调用的处理过程如下:
- 初始化所有函数参数(可能使用默认参数)
- 将控制权转移到函数(
this
现在可用)
- 执行函数体并创建返回的对象
- 将控制权转移回调用者(
this
不再被提供)
- 销毁函数参数
注意:步骤 4. 和 5. 的顺序由实现定义
您正在尝试访问this
在步骤 1 中,这还为时过早,更不用说默认参数中的 lambda 通常不能捕获。
Solution
添加第二个重载,例如
void B() { B( [this] {} ); }
可以解决问题,但最终会得到两个函数而不是一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)