
多参数的构造函数的隐式类型转换,之前只支持单参数的。
string ret = "xxxxxx" (explicit可以阻止这种隐式转换)

底层为两个指针,一个指向第一个元素,另一个指向最后一个元素的后一个位置



initializer_list是类模板
让vector支持lt构造。
- vector(initializer_list
lt) - {
- reserve(lt.size());
- for (auto e : lt)
- {
- push_back(e);
- }
- }

- void func(int* p)
- {}
- void func(int p)
- {}
- //const enum inline去替代宏
- int main()
- {
- int* p = NULL; // int* p = 0;
- func(NULL); // func(0);
-
- return 0;
- }

-
- int main()
- {
- int a1[10];
- array<int, 10> a2;
-
- a1[15] = 1; // 指针的解引用
- a2[15] = 1; // operator[]函数调用,内部检查
-
- // 用这个也可以,显得array很鸡肋
- vector<int> a3(10, 0);
- }
单链表

左值引用的使用场景和价值是什么?
使用场景:1、做参数 2、做返回值 价值->减少拷贝
右值引用的使用场景和价值是什么?
使用场景:某些情况下可以减少深拷贝

如何用右值引用进行优化?


一个深拷贝场景:

用右值引用接收 右值将亡值(自定义类型),内置类型为纯右值:
s1:构造+拷贝构造+赋值 --> 构造+移动构造 2次深拷贝-->0次
s2:构造+拷贝构造+拷贝构造-->构造+移动构造(str是一个左值,为了优化为移动赋值,编译器内部将其识别为右值将亡值) 2次深拷贝-->0次(下图为s2的场景)

push_back(val) new Node(val) _val(val)
都要提供一个&&右值引用的版本。

对于T&&接收后的t,无论是否折叠,即无论是左值引用&还是右值引用&&,其本身的属性是左值
当需要传递右值时,需要用forward

能传给swap中的左值引用,说明移动构造时s变量本身就为左值属性。
移动拷贝时需要swap完成资源转移,必须要修改,则右值引用本身为左值属性。

利用forward,逐层传递,保持右值属性。