记录下C++11完美转发的心得体会

来源:互联网 发布:vscode插件 web前端 编辑:程序博客网 时间:2024/05/16 08:21

从网上看了不下三次c++11的完美转发,但是依旧一直忘记, 今天看到一篇关于分析boost智能指针多线程安全性的文章(可以看这里),文末提到make_shared可以把counter和保持对象分配在一起,少了1次堆内存分配。 数据结构是:

 

用法就是: shared_ptr<Foo> shr_foo = make_shared<Foo>(...), 其中make_shared的参数就是你要调用的Foo构造函数的参数,要实现这样的功能就需要用到c++11的完美转发.

说简单点完美转发就是调用func1, 借由func1调用func2, 就像直接调用func2一样,本来想传给func2的参数,借由func1转发后还是保持着“属性”。这里的属性是指const/non-cost,左值/右值。

因为借由func1调用func2,为了避免在func1这层就出现了拷贝,func1的参数都必须是引用类型的,至于最后是不是拷贝还是引用则由func2来决定。为了使得所有的参数类型都能转发,肯定得用模板,这时候脑海里能想到的func1使用应该是这样的:

template <class T>void func1(T& t){    func2(t);}

这里只有四种情况(没有&&符号的时候):

实参为const 左值, func1能完美转发

实参为non-const 左值, func1也可以完美转发

实参为const右值, func1推导为const U& , 然后const 右值实参是可以付给 const U&的, func1也可以转发(vs上编译不过, gcc?)

实参为non-const右值,func1推导出U&, 此时编译不过。

 

--未完,先睡觉!

=========================================

关于左右值和const的模板推导的问题:

推导不出引用关系,在引用前提下能推导出const。
 eg:

template <class T>void test(T t){}template <class T>void test2(T& t){}int a = 10;int& ref = a;test(ref);//这里t还是intconst int b  = 10;test(b);// 这里t还是inttest2(b)// 这里t是const int&

=========================================

 


 

 

 

原创粉丝点击