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