是否有一种方法可以通过引用来防止lambda捕获
Is there a way to prevent lambda capture by reference
我正在重构依赖lambda的现有代码。在新版本的代码中,我想推迟对lambdas的调用,所以我想防止任何未来的用户意外地通过引用捕获,以及使用编译器找到所有有问题的现有代码。
这在c++11中可能吗?
No。而且它不会有太大帮助:一旦生命周期超过当前作用域,您必须同时按和值捕获,以确保所有指针或引用(以任何方式)资源的生命周期都得到管理。
异步回调与同步回调是一种本质上不同的东西,c++类型系统无法在这里强制执行安全性。
即使资源生命周期问题得到解决,调用代码也期望由lambda引起的更改立即发生,但现在它们没有发生。每次使用都必须为新模式进行审计。
使用编译器查找所有存在问题的代码。
这是可能的,但是不平凡的使用libtools/clang插件——但可能不是你期望的那样。
你可以编写一个插件,让编译器在编译完所有代码后运行,并且该插件可以在编译代码时检查clang构建的AST。您可以遍历AST以查找lambda并检查其捕获列表的类型。这很酷,但文档不是很好,而且可能是一个耗时的过程。对于一次性项目来说可能不值得。
相关文章:
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 修改在 std::future 的 lambda 中引用捕获的值
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- 无法通过引用捕获 lambda 中的成员变量
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 我无法通过引用捕获传递 lambda
- 为什么标准不允许通过引用捕获不完整的异常类型?
- 通过引用捕获与移动,lambdas
- 在 lambda 中通过引用捕获thread_local变量无法按预期工作
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- 列出生成器(lambda的向量)会导致通过引用捕获的非常奇怪的行为
- 在标准算法中,通过引用捕获更正确
- 包含通过引用捕获的 lambda 函数的"variable"的类型是什么?
- 是按值抛出和按引用捕获的经验法则
- 从函数返回 lambda 并传入引用捕获
- 在C++11 lambda中通过引用捕获静态变量
- 为什么 GCC 允许通过右值引用捕获
- C++11通过引用捕获的lambdas一般是可破坏的
- 替代具有引用捕获的函数指针