C++核心准则F.53:非局部使用变量时避免使用值捕捉

面向对象思考

共 1423字,需浏览 3分钟

 · 2019-12-04

61fa9d034728ad77fb423ef0ff5b69d6.webp

F.53: Avoid capturing by reference in lambdas that will be used nonlocally, including returned, stored on the heap, or passed to another thread

如果捕捉的变量可以能被非局部使用,则应避免在lambda表达式中使用引用形式的捕捉。非局部使用包括返回,保存在堆中,或者传递给其他线程。

Reason(原因)

Pointers and references to locals shouldn't outlive their scope. Lambdas that capture by reference are just another place to store a reference to a local object, and shouldn't do so if they (or a copy) outlive the scope.

指向局部变量的指针和引用的生命周期不应该长于它们的作用域。通过引用捕捉变量的lambda表达式只是另外一个保存指向局部变量的引用的场所,如果这个lambda表达式(或拷贝)的生命周期超过作用域时不应该使用引用形式的变量捕捉。

Example, bad(反面示例)
int local = 42;
// Want a reference to local.// Note, that after program exits this scope,// local no longer exists, therefore// process() call will have undefined behavior!thread_pool.queue_work([&]{ process(local); });
Example, goodint local = 42;// Want a copy of local.// Since a copy of local is made, it will// always be available for the call.thread_pool.queue_work([=]{ process(local); });


Enforcement
  • (Simple) Warn when capture-list contains a reference to a locally declared variable

    (简单)当捕捉列表中包含本地声明的变量时报警。

  • (Complex) Flag when capture-list contains a reference to a locally declared variable and the lambda is passed to a non-const and non-local context

    (复杂)在捕捉列表中包含指向局部声明的变量而且lambda表达式被传递给非常量或非局部上下文时做出提示。


     译者注:第一种情况容易实现但并不完美。


觉得本文有帮助?请分享给更多人

关注【面向对象思考】,每天前进一小步

有任何疑问,欢迎留言提问或讨论




面向对象设计,面向对象编程,面向对象思考!

   

浏览 28
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报