“c++11“,右值,右值引用,可变参数模板...
博主c++学习笔记,碎碎念:
本篇适合稍稍了解了右值引用,但还想看看别人是怎么想的人。
主要有关于右值理解,移动语义,完美转发;可变参数模板,lambad,包装器,后续还会写一下智能指针部分的笔记。
“第一次学c++11部分知识都是大半年前了,现在才把笔记补上,QAQ,”
关于列表初始化,太简单了,看一遍就懂了没必要记录;
右值,右值引用,移动语义,完美转发
个人理解:
值类别 - cppreference.com,右值概念
c++11引入了“右值引用”概念,为了什么?
假如你要设计一个class类,它既要深拷贝的拷贝构造,又要浅拷贝的拷贝构造(当一个对象里面的资源需要转移的时候),是不是很尴尬?
你要面临的是自己设计一套成员函数啥的去满足,代码会很丑陋,而且使用的时候还得分出一份精力去考虑是深拷贝还是浅拷贝,并且联动STL标准库的时候更难受了,c++11之前STL标准库的构造仅有左值引用的深拷贝,和你造的这个class结合到一块使用只能调用拷贝构造(比如vector的拷贝构造调用了你写的这个class的拷贝构造,但你压根都没拷贝构造,你为了深拷贝和浅拷贝,都另外设计了一套成员函数),这又要逼迫你去继承STL标准库,然后去扩展你的这套深拷贝,浅拷贝的成员函数以实现,正确的调用(深拷贝成员函数调用深拷贝成员函数,浅拷贝成员函数调用浅拷贝成员函数)。以上你辛辛苦苦实现了之后还要面对日常使用上的美观损失,实在是遭罪。
ps赋值拷贝也是如此,(不要想着一个赋值用浅拷贝,拷贝构造用深拷贝,有些人设计的时候赋值直接就是调用的拷贝构造)
好在c++11引入右值引用解决了这个问题,即提升了效率,又使代码变得美观了。
c++11之后,类里面多了“移动构造和移动赋值构造”,长下面这样:
ClassName(ClassName&& other) {// 转移资源// 释放other的资源
}ClassName& operator=(ClassName&& other) {if (this != &other) {// 释放当前对象的资源// 转移资源// 释放other的资源}return *this;
}
多了个&&的新符号,它就是与&相对的右值引用,接下来,看一看右值的概念(纯右值和将亡值值类别 - cppreference.com 和前面的链接是一样的)你就会豁然开朗,
移动语义就是上面的转移资源的“浅拷贝”,
完美转发的出现是因为右值引用产生的变量是左值,这在层层扩展包装的c++中,不能将这个右值引用产生的变量,直接传递到下一层(因为它算左值,直接传递,下一层就错误了,本该是调用右值的那个,反而错误的调用了左值的版本),解决这个的方法称为完美转发,
std::forward<T>(arg) //argument 参数的简写,遇得到看不懂命名的要查,
好了剩下的都很简单,不写了,
可变参数模板
简单的写一下博主自己想要记的:
递归处理。
(GetArg(args)...)
会将参数包展开,生成一系列GetArg
函数的调用,例如GetArg(arg1), GetArg(arg2), ...
。- 可以使用
...
来展开参数包。例如,sum(args...)
会将参数包args
展开为多个参数,传递给sum
函数。
剩下的lambad,包装器,知识点不多,写了和别人的也一模一样,鸽了,
智能指针先鸽了