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

从网上看了不下三次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还是int
const int b  = 10;
test(b);// 这里t还是int
test2(b)// 这里t是const int&

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

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值