第七章 传递参数是引用还是值

1.按值传递

template<typename T>void func(T t){
}

当调用std::string s("moban");func(s);s是一个左值引用但是模板函数是按值传递,所以std::string& 退化为std::string,同样的按值传递时const & &&全部被去掉 按值传递的缺点是你无法区分传入的参数类型

2.按引用传递

template<typename T>void func(const T&t){
}

如果调用如下 const int a = 5;func(a);T的类型int t的类型为const int&

3.传递非const参数

template<typename T>void func(T&t){
}
当调用func(std::string("l"));//error
但是const std::string s = "canshu";func(s);//ok!

4.关于万能转发

template<typename T>void func(T&&t){
    T a;
}
如果如下调用int a=5;func(a);根据引用折叠规则T的类型T&

5.使用std::ref和std::cref