本文记录了我读Effective Modern C++时自己的一些理解和心得。

item1:模板类型推导

1)reference属性不能通过传值参数传入模板函数。这就意味着如果模板函数需要一个reference类型的参数,必须在模板声明中将其声明为reference,否则,即使使用一个reference类型的变量调用模板函数,类型推导的结果将不带reference属性。

2)constant和volatile属性也不能通过传值参数传入模板函数,但是可以通过reference参数传入这些属性。

3)如果在模板中声明universal reference参数,那么左值参数会被推导成左值引用,右值参数会被推导成universal reference(&&)。

4)数组型变量和函数型变量会通过传值参数推导成相应的指针型变量。而如果在模板中声明为传引用参数,则会被推导成数组引用(包含数组大小信息)和函数引用。

item2:auto类型推导

1)auto类型推导规则和模板类型推导规则相同,除了处理以{}初始化的参数的情况。

2)模板不能推导被{}初始化的参数,除非将它声明为std::initializer_list<T>类型的参数。

#include <iostream>

template<typename T>

void f1(T param) {  return; }

template<typename T>

void f2(std::initializer_list<T> param) {  return; }

int main()

{

auto i = { 1, 2, 3, 4 };

f1(i); // good

//f1({ 1, 2, 3, 4 }); //error

f2({ 1, 2, 3, 4 }); //good

return 0;

}

3)在C++14中,返回值为auto类型的函数不得返回以{}初始化的值。lambda函数的auto类型参数也不能以{}初始值作为参数调用。

auto f1() {     return 4; } //good

auto f2() {     auto i = {1,2,3,4};     return i; } //good

error auto f3() {     return {1,2,3,4}; } //error

item3:理解decltype

1)decltype不加任何修改地返回参数的类型

2)decltype的典型应用是保持左值的引用属性

item4 :如何查看推导类型

1)方法有:从IDE编辑器查看,编译错误诊断,运行时输出。

2)std::type_info容易出错,推荐使用boost::typeindex。

item5:推荐使用auto,而不是显式声明类型

1)使用auto可以确保变量被初始化。

2)使用auto可以避免因为隐式的类型转换而生成临时变量。

3)使用auto可以确保类型一定是对的,例如size()的类型和迭代器(iterator)的类型。

4)使用auto使代码简洁。

item6:哪些地方不要用auto

1)特殊的数据类型,例如std::vector<bool>。凡是有看不见的代理类(invisiable proxy class)的情况都要慎用auto。

2)需要显示指定类型的推荐用法是:

auto x = static_cast<type>(initializer)

这样可以明确表示此处发生了类型转换。

<未完待续>

[C++11] Effective Modern C++ 读书笔记的更多相关文章

  1. [.NET] 《Effective C#》读书笔记(二)- .NET 资源托管

    <Effective C#>读书笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内 ...

  2. Modern Algebra 读书笔记

    Modern Algebra 读书笔记 Introduction 本文是Introduction to Modern Algebra(David Joyce, Clark University)的读书 ...

  3. 《More Effective C++ 》读书笔记(二)Exception 异常

    这事篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...

  4. 《More Effective C#》读书笔记

    <More Effective C#>这本书,大概是四年前看完的,但只整理了一部分读书笔记,后面有时间的话,会陆续补充的. More Effective C# :使用泛型 More Eff ...

  5. 《More Effective C++》读书笔记(零)Basic 基础条款

    这是篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...

  6. 《Effective Java》读书笔记 - 11.序列化

    Chapter 11 Serialization Item 74: Implement Serializable judiciously 让一个类的实例可以被序列化不仅仅是在类的声明中加上" ...

  7. 《Effective java》-----读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...

  8. 《Effective Java》读书笔记(一)之创建和销毁对象

    最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的 ...

  9. 《effective c++》读书笔记(上)

    最近在读<Effective C++>,确实是经典之作,但是有的条款也需要一些细节补充,所以都列在这篇文章里,希望能不断更新,个人阅读的是第三版,不包括C++ 11的内容. 条款1:视C+ ...

随机推荐

  1. input 字符限制

    1,文本框只能输入数字代码(小数点也不能输入): onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste=&q ...

  2. AngularJs中的directives(指令part1)

    一.指令的职责   指令的职责是修改DOM结构,并将作用域和DOM连接起来.即指令既要操作DOM,将作用域内的数据绑定到DOM节点上,又要为DOM绑定事件调用作用域内的对应的方法. 二.创建自定义指令 ...

  3. 用jquery在必填表单字段前加红星总结

    一.总结: 今天公司项目中要求给表单中的必填字段添加标记,因为表单字段比较多,后期又有可能某些字段会有变化,所以写了一段js代码来给表单添加标记. html代码: js代码: 关键步骤: 1.红星的设 ...

  4. Hadoop学习1--解决启动过程中的问题

    方法:http://www.aboutyun.com/thread-12694-1-1.html http://www.linuxidc.com/topicnews.aspx?tid=13 http: ...

  5. Tomcat插件与Jetty插件在MyEclipse中的配置

    -Djetty.port=8101 jetty:run tomcat6:run <plugin> <groupId>org.apache.tomcat.maven</gr ...

  6. Form_Form Builder开发基于视图页面和自动代码生成包(案例)

     2014-01-06 Created By BaoXinjian

  7. CE_现金模组基本概念(概念)

    2014-07-12 Created By BaoXinjian

  8. [ Iptables ] Linux开启防火墙,切记仔细确定每个端口

    一.缘由: 祸起Redis未授权访问漏洞被利用,删除了服务器的所有账号,导致无法登陆:这才不得不把开启防火墙提上日程.再次在开启防火墙过程中,一刀切造成了一些前段进程的端口被封,甚是后悔! 二.解决办 ...

  9. linux命令(11)下查看和添加环境变量

    &PATH:决定了shell将到哪些目录中去寻找命令或者程序,PATH值是一系列的目录,当你要运行一个程序时,Linux在这些目录下进行搜寻编译链接. 编辑PATH 声明,其格式为: PATH ...

  10. RBStoryboardLink库的使用注意事项 -转载至--坤哥MartinLi博客

    RBStoryboardLink库的使用注意事项 demo下载:https://github.com/MartinLi841538513/RBStoryboardLinkDemo 操作步骤: 1,引入 ...