1.static_cast静态转换<>要转换的类型,不适用于指针转换
reinterpret_cast<char*>()指针类型的转换
涉及到const,必须用const_cast
打印地址的时候用reinterprt_cast<void*>
2.dynamic_cast<>()动态绑定(多态)子类转到父类
子类对象.父类::方法();
delete函数之后,要求精确匹配
堆上创建都是用指针创建
Initializer_list<>
initializer_list<XXX> list自动管理内存进行构造创建
一般的{}都是这个原理
用这个做参数的好处是可以把{}的东西当对象接进来,然后尽心堆上的拷贝与备份
3.forward_list list1.before_begin()链表的头节点
对于单链表而言,一个头节点存储存储着第一个节点的地址,before_begin()返回头节点的指针
单链表是没有大小的(no size)
4._if_exists(run)判断是否存在,没有就不执行,但不报错
_if_not_exists(run)不存在就执行, 就是检测函数类型,变量是否存在
测试模板的类型,封装的模板,可以用这个探测类型
5.模板不识别引用,只能用包装器
对模板而言,任何不加ref()的都是副本,加ref()的都是原本
6.模板带一个&,什么情况都是原本。模板自带&,无论是左值还是右值都是原本
7.模板参数:对*和&不参与构造,std::ref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,std::ref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型
8.模板可以有默认值,类型还是会根据提供的进行推断,数据才能完完整整的作为默认值
对模板而言去直接对类型进行赋值而没有确定类型的时候必须指定出类型才可以
唯一合理的方式是:在模板的外层规定方式,内层规定制定数据
从右往左写齐,左边缺的用值推断类型
9.对模板而言,模板自动匹配星号多的
10. static_assert(a,"语句")//a不能是变量
要满足的条件,不符合则报告位置,像是下的断点
11.inline函数的限制:不递归,不static,不循环,不switch,goto,不数组
只要声明了,定义的时候无所谓