[C++11] Effective Modern C++ 读书笔记


本文记录了我读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)

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

 

<未完待续>


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM