上面的{}初始化已然很方便,但是如果说我们要初始化像vector如许的对像时,他的参数个数是会发生变化的,显然仅仅只有上面的{}远远无法满足这种需求。所以c++中就提供了std::initializer_list的类, auto il = { 10, 20, 30 }; // thetype of il is an initializer_list ,这个类的本质是底层开一个数组,将数据拷贝过来,std::initializer_list内部有两个指针分别指向数组的开始和竣事。
这是他的文档:initializer_list - C++ Reference,std::initializer_list支持迭代器遍历。
区别是{}还是initializer_list的方法也很简朴,{}传入的值个数是固定的,由须要初始化的对象类型决定,里面所有数据的类型可能不同。后者可写入的值不固定,但类型一定雷同。
map<int, string> m{ {1,string("hallo")} };
vector<string> v{ "a","b","c" };
复制代码
二,右值引用与移动语义
我们之前学习的是C++98中的引用,比如原本有一个int类型的对象x,那么int& b = x,此时b其实就是x的别名。C++11之后,我们之前学过的这种引用方式被叫做左值引用。须要注意的是,无论是左值引用还是右值引用,本质上都是取别名。
2.1左值与右值
我们上面也说过,对于int&& x = y;此时的x为左值属性。我们发现对于上图中的两次fc调用,n是左值直到传到f1时也可以保持其左值属性不变。但0在传入fc之后,0是一个右值,一个右值被右值引用绑定后,右值引用变量表达式的属性是左值,也就是说fc函数中t的属性是左值。此时便会调用f1的左值引用版本,换言之0在函数传递中失去了其自己的右值属性。如果我们想要保持0自身的右值属性在传递中不丢失,就须要使用完美转发。
完美转发: