类型推导 --- C++高效编程
- 函数模板的类型推导 ---- 调用时没有指定类型T
- 万能引用的作用:使函数模板的参数能够接受左值和右值 ----- 提出的原因
- 注意事项:
- 必须是函数模板
- 必须发生了模板类型推导,没有发生显示调用
- 类型参数T必须紧紧跟着&&
- 不能加const,否则会失效
- 函数模板的形参可能存在三种情况:按值、按引用/指针、万能引用(右值引用)
- 按值传递的时候,类型推导会丢失const和volatile属性,同时也会丢失引用的属性;
- 按指针传递的时候,不丢弃cv属性
- 按左值引用传递的时候,不丢弃cv属性,丢弃引用属性;
- 按万能引用传递的时候,不丢弃cv属性,有左值(不为左值引用)即为左值引用(引用折叠)
template <typename T> // 调用的时候没有指定类型T
void func(T param) // 按值传递
void func(T ¶m) // 按左值引用
void func(T &¶m) // 按万能引用
//int &¶m -- int ¶m
//int &&¶m -- int ¶m
//int &&&¶m -- int &¶m
-
-
-
- 完美转发:发生类型推导的函数模板中调用了另外一个指定参数类型的函数
void test(int &r_lnum) // 指定了类型只能为左值
{
cout << r_lnum << endl;
}
template <typename T>
void func(T &¶m)
{
//test(std::forward<int &&>(param)); //forward:可以实现左右相互转换
test(std::forward<int &>(param));
}
-
-
-
-
- std::move( ) ------ 左值转化成右值
- std::forward< >( ) ------ 可以实现左右值得相互转换
- 右值引用本身就是一个左值,可以对其进行修改。
- auto类型推导
- auto指针不会丢弃cv属性
- auto引用会丢弃引用属性
- auto变量推导一切正确
- decltype类型推导 ----- 可以在推导出类型的同时声明变量
- decltype变量还是对应类型的变量
- decltype指针和引用推导出对应类型的指针和引用
- decltype解引用推导出引用
- declype表达式,如果表达式左值可以作为左值,则返回左值引用
- decltype(auto)用于函数返回值得推导
- decltype VS auto