从网上看了不下三次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&
=========================================