Variadic Templates 数量不定的模板参数
针对函数:
这种特性可以用来递归调用。这个递归的作用是把不定个数的参数 一 一 分解 。 当我们在使用这个模板特性的时候一定要写一个处理最后一种情况的东西,在这里是一个函数 print() 。因为最后一次递归调用的时候参数为空。
c++11之后模板参数的尖括号可以写到一起了(编译器变得越来越智能)
nullptr 和 nullptr_t
auto
Uniform Initialization
Initializer_List<>
编译器看到{}之后会调用initializer_list的构造函数,传进去两个参数,一个array的头部和一个大小,事实上编译器在调用构造函数之前已经准备好了一个array。
initializer_list对象只是引用了array的第一个元素,指向他,并不是把整包东西传递进去,再进行拷贝的时候,也是只创建了一个新的iterator指向同一个array,浅拷贝。
标准库新增的版本, min 和 max 都可以接收任意个数的参数进行比较。
explicit for ctors taking more than one argument
c++2.0之前 : explicit 告诉编译器不要自作聪明帮我做构造函数的隐士转换, 要在我明确调用构造函数的时候才使用。 2.0之前只可以提供单一的参数,2.0之后可以提供多个参数的版本。 本质都是不希望编译器帮我们做隐士类型转换。
range based for statement (for循环的特殊写法)
利用迭代器将coll(容器)里的元素一个一个的取出来赋值到decl身上,然后执行statement。
如果两边类型不一致编译器会进行类型转换。
c++2.0有两个函数 begin()和end()是可以直接接收容器的
=default , =delete
一个类如果带有指针成员, 那么一定要自己定义big three,如果是普通成员则大多数都不需要自己写出。
Alias Template(template typedef) 模板别名
使用iterator_traits萃取器将容器的迭代器传进去有一个value_type函数可以得到容器的类型。
template template parameter 模板模板参数
当你将一个模板当作参数传递给另一个模板时,编译器没有办法知道你的第二个参数有默认值,而且第二个参数的类型依赖第一个参数。
使用alias template 可以解决这个问题。
Type Alias (similar to typedef)
using 多种用法
noexcept
保证这个函数不抛出异常,但是是可以有先决条件的 noexcept( true ) 。
如果你的class里面有move function ,一定要注意不要抛出异常,写上noexcept让编译器放心的调用你,也让使用者放心的使用。
override 复写,改写 应用到虚函数身上
当你要复写虚函数的时候,告诉编译器,把你的心意告诉它,我就是要复写虚函数,帮助编译器帮你检查错误。
final
第一种用法: 放在类里面,告诉编译器,我就是继承体系下的最后一个类final,不能再继承我了。让有类继承我的时候,就会报错。
第二种用法: 针对虚函数。 意思是这个虚函数不允许被复写。
decltype
第一种应用: 宣告一个返回值类型。 返回类型后置。
第二种用法:适用于原编程。
模板只是一个半成品,具体能不能用还得看二次编译后的情况。
第三种用法:
Lambdas
lambdas 本质是个对象(可以想象成一个函数对象) , 加小括号调用lambdas表达式。 auto l 意思是我先把这个lambdas记录起来 , 然后 l() 调用它。 上面那个lambdas 只可以调用一次,下面这个可以多次调用。 当你只是临时想到一些东西的时候可以直接写出来,不必做成函数调用的形式。
如果那三个可选项写了一个以上,那小括号就一定要写。否则可以不写小括号。
如果是按值捕获,想要修改的话要加上mutable。
lamdbas没有默认构造函数, 如果给一个容器指定了lambdas的比较器,那么在定义这个容器的对象的时候也要把lambdas作为参数传递给这个容器。 lambdas是内联的