Effective Modern C++ 读书笔记之第六章

Posted on Thu 06 October 2016 in 读书笔记 • Tagged with c++11, lambda

lambda表达式

Item 33 避免使用默认的变量捕获方式

上面说到c++11的lambda表达式有两种变量的捕获方式:按值(复制)捕获和引用捕获。Item33在采用引用模式(默认[&]会捕获定义lambda表达式作用域下的所有变量, [&params]为显示捕获定义lambda表达式作用域下特定的变量)下,如果不加注意的话,lambda表达式很容易走出引用变量的作用域范围,造成悬空引用,会产生未定义的错误。

#include <iostream>
#include <functional>
#include <string>
class A
{
 public:
    A() : name_("default"){}
    void Print() const {
        std::cout << "A::Print: " << name_ << std::endl;
    }
 private:
        std::string name_;
};

typedef std::function<void()> func …

Continue reading

Effective Modern C++ 读书笔记之第二章

Posted on Wed 03 August 2016 in 读书笔记 • Tagged with c++11

auto关键字

Item5:auto优先于显示类型声明

首先,在C/C++中声明一个变量,如果不进行初始化,其默认值可能会因为其所在的作用域的不同而不同,在使用的时候可能会出现意想不到的错误。而auto类型的变量类型是从初始化进行推导的,所以需要在定义auto变量的时候进行初始化。使用auto变量可以强制对其进行初始化。

int a; //ok
auto x = 10; //ok
auto a; //error: declaration of ‘auto a’ has no initializer

其次,使用auto可以避免冗长的显示类型声明,特别是在操作STL的各种容器及迭代器等, auto能够敲很多冗余的代码逻辑,如:

std::map<std …

Continue reading

Effective Modern C++ 读书笔记之第一章

Posted on Thu 21 July 2016 in 读书笔记 • Tagged with c++11, lambda

Item 1: 理解模板类型推导

C++98只有一种模板参数类型推导即函数模板参数类型推导,但是在C++11之后,修改了原有的类型推导规则,并加入了auto和decltype的推导规则。 函数模板形如如:

template<typename T>
void f(ParamType param);// ParamType可以是T加上各种修饰,如const, reference,指针等

然后在程序逻辑中调用该函数:

f(expr); // expr为传入到函数f中的参数

在编译器进行编译的时候,编译器通过expr来进行两部分的推导:ParamType 和 T。 在这里,书中总结了ParamType的三种不同类型: 1. 当ParamType是指针或者引用的类型,但不是universal reference类型(这个会在Item 24讲到)。

  1. 当ParamType是universal reference类型

  2. 当ParamType既不是指针也不是引用类型。

下面依次详解ParamType在不同类型下,参数推导的机制。

Case 1: ParamType是指针或者引用类型, 但不是universal reference …

Continue reading