c++ - Lambda:未评估上下文中未捕获的对象
问题描述
我很感激一个指向标准段落的指针,指出以下代码格式正确:
int main() {
int var = 0;
return [] { return sizeof(var); }(); // var is not captured!
}
类似的例子出现在第 8.4.5.2 节中,但我找不到任何关于它的口头描述。
解决方案
它是根据何时必须捕获实体来指定的,而不是根据何时不能捕获实体来指定。
[expr.prim.lambda.capture](有一些遗漏)
8 ... 如果 lambda 表达式或泛型 lambda odr 的函数调用运算符模板的实例化使用 this 或从其到达范围内具有自动存储持续时间的变量,则该实体应由 lambda 表达式捕获。...
[ 例子:
void f1(int i) { int const N = 20; auto m1 = [=]{ int const M = 30; auto m2 = [i]{ int x[N][M]; // OK: N and M are not odr-used // ... }; }; // ... }
—结束示例]
您的代码示例中的关键var
是未使用 odr,因为它是未评估的操作数。因此,它不需要被捕获。
推荐阅读
- mongodb - 在 spring-data mongodb 中构建动态查询的 Criteria API
- continuous-integration - 使用 Github Actions 报告条件作业的状态
- for-loop - 将 NxN for 循环修改为更简单
- azure - 发生 Azure Function App (python) 部署时生成通知
- powerbi - 每月数据在绘制时切换为每日数据
- java - 给定排序数组,如果数组 A 包含元素 A[i] 使得 A[i] = i (递归和分而治之),则返回索引 i
- python - 如何解决谷歌云控制台中的“ModuleNotFoundError: No module named '_lzma'”问题
- java - 在圆内创建三角形
- slim - Slim 4 中间件重定向*在途中*
- c++ - 为什么理解这个递归示例如此难以直观?