万能引用
C++11里面的概念可以同时绑定左值和右值,右值引用与自动类型推导的结合,定义时候必须初始化,根据初始值是左值还是右值,自动推导为左值引用或右值引用
引用折叠
2个右值引用会被折叠成一个右值引用,其他情况下都是左值引用
完美转发
完美转发的主要目的是解决函数模板中参数传递的类型推导问题。当我们在函数模板中接收参数并将其传递给其他函数时,我们希望保留原始参数的类型(左值引用、右值引用或值类型)和常量性(const)。这样可以确保传递的参数在接收函数中得到正确的处理。
cpp
#include <iostream>
#include <string>
#include <utility>
using namespace std;
class xiaotangTest
{
private:
string name;
int age;
public:
xiaotangTest(): name("xiaotang"),age(30){
cout <<"构造函数"<<endl;
}
xiaotangTest(const xiaotangTest& other):name(other.name),age(other.age){
cout <<"拷贝构造函数"<<endl;
}
xiaotangTest(xiaotangTest&& other):name(move(other.name)),age(other.age){
cout <<"移动构造函数"<<endl;
}
};
template<typename T>
void apply(T &&a)
{
xiaotangTest dudu(forward<T>(a));
}
int main()
{
xiaotangTest src;
apply(move(src));//强制转换为右值引用xiaotangTest&&
return 0;
}
使用场景
泛型函数模板:在实现泛型函数时,有时需要将参数原封不动地传递给其他函数。使用万能引用和 forward,我们可以将传入的参数完美转发到其他函数,保留其原始值类别。
实现容器类:当实现自己的容器类时,例如 vector 或 tuple,需要正确处理元素的构造和销毁。完美转发可以用于在容器内部处理元素的构造和销毁,确保元素的移动构造函数或复制构造函数被正确调用。
封装其他函数:有时我们需要封装其他函数并将参数传递给封装的函数。通过完美转发,可以保留封装函数的调用方式,将参数正确传递给内部的被封装函数。
转发成员函数:在某些情况下,需要在类中编写转发函数,将调用转发给类成员的其他函数。完美转发可以在类中实现这样的转发,确保传递参数的准确性。
智能指针
自能自动化的管理指针所指向的动态资源的释放,它是一个类有类似指针的功能,能*和->运算符进行了重载
unique_ptr:不允许拷贝构造和赋值操作,允许函数返回unique_ptr类型指针,支持对象数组
cpp
void UniquePtrtest()
{
unique_ptr<Test> up(new Test);
up->Show();
//void unique_ptr<Test> up2=up; // 禁止拷贝构造和运算符重载
unique_ptr<Test[]> up3(new Test[5]);//可以管理数组
}
shared_ptr:智能指针A拷贝构造产生智能指针B时,AB共享同样一个对象
智能指针A赋值给智能指针B时,AB共享同样一个对象
shared_ptr指针实现的时候,内部使用了引用计数的技术
cpp
void SharedPtrTest()
{
shared_ptr<Test> sp(new Test);
sp->Show();
shared_ptr<Test> sp2=sp;
sp2->Show();
sp->Show();
cout <<sp2.use_count()<<endl;
cout <<sp2.get()<<endl;
shared_ptr<Test> sp3(new Test("world"));
sp3=sp;