ES.28: Use lambdas for complex initialization, especially of const variables

ES.28: 使用lambda表达式进行变量的复杂初始化,特别是常量变量

Reason(原因)

It nicely encapsulates local initialization, including cleaning up scratch variables needed only for the initialization, without needing to create a needless non-local yet non-reusable function. It also works for variables that should be const but only after some initialization work.

这种方式漂亮地封装了局部初始化,包括清理只在初始化过程中需要的临时变量,而不是生成一个不必要的非局部但却不会重用的函数。它也可以用于应该是常量但却需要某些初始化处理的变量初始化.

Example, bad(反面示例)

widget x;   // should be const, but:
for (auto i = 2; i <= N; ++i) {          // this could be some
    x += some_obj.do_something_with(i);  // arbitrarily long code
}                                        // needed to initialize x
// from here, x should be const, but we can't say so in code in this style

Example, good(范例)

const widget x = [&]{
    widget val;                                // assume that widget has a default constructor
    for (auto i = 2; i <= N; ++i) {            // this could be some
        val += some_obj.do_something_with(i);  // arbitrarily long code
    }                                          // needed to initialize x
    return val;

Example(示例)

string var = [&]{
    if (!in) return "";   // default
    string s;
    for (char c : in >> c)
        s += toupper(c);
    return s;
}(); // note ()

If at all possible, reduce the conditions to a simple set of alternatives (e.g., an enum) and don't mix up selection and initialization.

如果可能,将条件压缩为一个由可选项(例如枚举)构成的简单集合并且不要将选择和初始化混用。

Enforcement(实施建议)

Hard. At best a heuristic. Look for an uninitialized variable followed by a loop assigning to it.

很难。最好是启发式的。寻找没有初始化的变量的后面跟着为其赋值的循环的情况.

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es28-use-lambdas-for-complex-initialization-especially-of-const-variables

觉得本文有帮助?欢迎点赞并分享给更多的人。

阅读更多更新文章,请关注微信公众号【面向对象思考】

ES.28: Use lambdas for complex initialization, especially ofconstvariablesES.28: 使用lambda表达式进行变量的复杂初始化,特别是常量变量Reason(原因)It nicely encapsulates local initialization, including cleaning up scratch variables needed only for the initialization, with... 本贾尼·斯特劳斯特卢普 赫布·萨特 ----------------------------------------------------------------------------------------------------------------- 内容:导言 C:类和类层次结构 ENUM:枚举 R:资源管理 ES:表达式和语句 Per:性能 并行性与并行性 首先要明确以下几点: C++中全局静态变量和静态成员变量(以下简称静态变量,其他类型的变量会单独说明)的初始化顺序由编译器决定,不同编译器下初始化顺序基本不一样,但是在同一个编译器下顺序却是一样,但是我们很难掌握其顺序(g++中好像有明确的方法指定顺序),所以静态变量初始化时不要相互依赖。 正常情况下静态变量在进入main函数之前即会完成初始化(有例外)。 局部静态变量初始化时机十分明确,一定是第一次调用该函数时初始化。 只要某一个模块(exe程序,dll库)被加载,那么该模块中的静态变量
一、C++11的介绍: 相较于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率。 二、C++11中的主要知识概念: (一)、初始化列表:
C++11中lambda捕获列表有两种方式:值捕获和引用捕获,捕获的是外层作用域的变量,也就是左值。 C++14进行了扩展,允许捕获的成员用任意的表达式进行初始化,相当于允许捕获右值。 int x = 100; auto f = [x = 0]() mutable { return x++; }; std::cout << "f()=" << f() << std::endl; std::cout << "f()=" << f() &l.
C++ 11中引入了新的lamdba表达式,使用也很简单,我最喜欢的是不用给函数取名称,每次给函数取名称都感觉自己读书太少~ 1、lambda表达式 lambda表达式可以理解为一个匿名的内联函数。和函数一样,lambda表达式具有一个返回类型、一个参数列表和一个函数体。与函数不一样的是lambda必须使用尾置返回类型。一个lambda表达式表示一个可调用的代码单元。 语法:[capture...
public BorderPane GetKeyOneTableView(final String dbPath,final String tableName,final String keyTab,final String andCondition){      final BorderPane borderPanel = new BorderPane();      TableView
Lambda表达式最重要的特点就是能够极其方便地创建函数对象。 其实,Lambda表达式能做到的事情,手工都能做到,无非就是多打一些字。 但是,Lambda表达式提供的简洁、易用、功能之强大,真是香啊! 总的来说,Lambda表达式经常用于以下场景: 标准库STL中使用,如std::find_if, std::remove_if, std::count_if等 自定义比较函数... 调用构造函数 new obj(...) 初始化成员列表 new obj { f1 = xxx, f2 = xxx, ... } 创建数组 new arraytype[] { e1, e2, e3, ...} 如果是匿名对象话,创建方式只
1.在l利用ambda表达式进行集合操作的时候,break,return 不能终止或者跳出循环 2.在lambda表达式的局部变量一定是只初始化一次,如果不是的话会报错:not effictive final,这样设计的目的 为了防止当这个变量被别的地方引用,会改变变量的值。 3.如果想在遍历集合的时候改变集合的元素的值,可以用peek这个惰性操作 4.求集合的交集,差集和交集用conta...
using System;using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1d class CTX public int id = 10; public string ...
为什么需要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名。1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值。正因为有这样的需求,c++引入了lambda 函数,你可以在你的源码中内联一个lambda函数,这就使得创建快速的,一次性的函数变得简单了。例如,你可以把lambda函数可在参数中传递给std::sort函数 #include