我想在我的 lambda 表达式中捕获一个本地指针。目前我的代码看起来像这样
MYButton* button;
button->onPress = [index,&](control*){
button->foobar(x, y);
};
Run Code Online (Sandbox Code Playgroud)
我收到错误
错误:(835, 13) 变量“button”无法在未指定捕获默认值的 lambda 中隐式捕获
我的印象是&在捕获子句中使用意味着通过引用捕获本地范围内的所有内容。在这种情况下,为什么我会收到此错误?
没有识别捕获默认值,因为捕获默认值必须是捕获中的第一项。有关详细信息,请参阅cpp 参考。
正确的代码应该是
MYButton* button;
button->onPress = [&,index](control*){
button->foobar(x, y);
};
Run Code Online (Sandbox Code Playgroud)
此外,index似乎没有使用捕获。您可以消除这种情况,在这种情况下,代码将是
MYButton* button;
button->onPress = [&](control*){
button->foobar(x, y);
};
Run Code Online (Sandbox Code Playgroud)
而且,正如 Chris Dodd 所提到的,这个 lambda 的使用可能超出了这个代码片段的范围,在这种情况下,您应该按值捕获以避免悬空引用:
MYButton* button;
button->onPress = [=](control*){
button->foobar(x, y);
};
Run Code Online (Sandbox Code Playgroud)
从cpp 参考:
如果非引用实体通过引用被隐式或显式地捕获,并且在实体的生命周期结束后调用闭包对象的函数调用运算符,则会发生未定义的行为。C++ 闭包不会延长捕获引用的生命周期。
再一评论。虽然默认捕获在纸上看起来不错(一个字符,没有大惊小怪),但我喜欢明确捕获以减少出现上述错误的风险。它还可以更轻松地识别 lambda 依赖的变量。在这种情况下,代码变为:
MYButton* button;
button->onPress = [button](control*){
button->foobar(x, y);
};
Run Code Online (Sandbox Code Playgroud)
这只是风格上的变化——这意味着与之前的示例相同,但在以后修改代码时应该不太容易出错。
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |