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

在 Thu 06 October 2016 发布于 读书笔记 分类 • 标签为 c++11, lambda

lambda表达式

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

上面说到c++11lambda表达式有两种变量的捕获方式:按值(复制)捕获和引用捕获。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 …

阅读全文

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

在 Wed 03 August 2016 发布于 读书笔记 分类 • 标签为 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 …

阅读全文

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

在 Thu 21 July 2016 发布于 读书笔记 分类 • 标签为 c++11, lambda

Item 1: 理解模板类型推导

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

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

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

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

在编译器进行编译的时候,编译器通过expr太进行两部分的推导:ParamTypeT。 在这里,书中总结了ParamType的三种不同类型: 1. 当ParamType是指针或者引用的类型,但不是universal reference …


阅读全文