一 类型区别概念
int a ; 我们定义一个int a ,就能明确的知道a 是int 类型的。
那么我们定义一个 auto b =10; 怎么知道b 的类型,以及auto 的类型呢?这句话的意思是: auto是有类型的, b 也是有类型的。
定义模版函数的时候,也存在同样的问题。
template <class T>
void func28(T tempt) {
}
我们传递给func28这个函数什么参数,值传递,引用传递,万能引用传递等,都会让T 的类型和 tempt的类型不同
可以看到,要学习完成这些全部的类型传递,还要先学习 万能引用是个啥,才能让这个知识点完整。
二 万能引用universal reference
万能引用的使用语境:
必须是函数模板,必须是发生了模板类型推断并且函数模板形参的样子是 T&&
T&& 就是万能引用。注意 T&& ,,T 和&&必须连在一起。否则不叫做万能引用
万能引用和右值引用 解释起来的区别:
如果是 形式参数 是 右值引用,则实参必须是右值,否则会有build error
如果是 形式参数 是 万能引用,则实参可以是左值,也可以是右值。
如果实参是左值,那么万能引用就变成了左值引用
如果实参是右值,那么万能引用就变成了右值引用。
//理清 类型区别 基本概念
void main() {
//void func25(const int & tempabc) {}
// tempabc 的类型是啥? 这个很容易看出来 是 "const int &"
func26(10);
//如上调用,void func26(const T & tempt) {}
//T的类型是啥?是 "int"
// tempt 的类型是啥? 是 "const int &"
// 结论一:调用函数模版时,传递的参数10会对T 的类型产生影响
//再来看 函数模版是右值的情况
func27(100);
int abc = 200;
//func27(abc);//实参要求是右值,我们传递的是左值,因此就有build error
//再来看 万能引用的情况,传递左值 或者右值 都是可以的。
func28(300);
int abc = 800;
func28(abc);
}
三,万能引用的误区 和 剥夺
误区一:只有在 函数模板的情况下 才有可能是万能引用,类模板下的成员函数不是。
如果使用const ,则会由万能引用 变成 右值引用
//万能引用
template <class T>
void func28(T&& tempt) {
}
//右值引用,被const 剥夺了
template <class T>
void func29(const T&& tempt) {
}
template <class T>
class Teacher {
//右值引用
void func28(T&& tempt) {
}
//万能引用
template <class U>
void func29(U&& tempt) {
}
};
本文介绍了C++中不同类型的概念,如int和auto的区别,以及模板函数和万能引用的用法。特别强调了在函数模板中发生模板类型推断时,如何区分右值引用和万能引用,以及它们在实际编程中的应用场景和常见误区。
242

被折叠的 条评论
为什么被折叠?



