116 C++ 类型区别概念,万能引用universal reference

本文介绍了C++中不同类型的概念,如int和auto的区别,以及模板函数和万能引用的用法。特别强调了在函数模板中发生模板类型推断时,如何区分右值引用和万能引用,以及它们在实际编程中的应用场景和常见误区。

一 类型区别概念

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) {
	}
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值