c++(15)处理类型--decltype类型指示符

本文深入解析C++中decltype关键字的使用方法及注意事项,包括如何通过decltype获取表达式的类型,以及在不同类型场景下decltype的行为表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

decltype类型指示符

很多时候,我们从一个表达式得到需要定义的变量的类型,但是却不想用这个表达式来初始化这个变量,这时候我们用到decltype类型指示符。

#include <iostream>
using namespace std;
int main()
{
	int i = 20;
	double b = 5.1;
	decltype (b+i) a = 3.3;
	cout << "a:" << a << endl;
	return 0;
}

前面代码中的例子,最终得到的a的类型就是b+i的类型int。

运行结果(由于a是int型,所以3.3被强制转换成立int):


decltype处理顶层变量和auto有些不同。

如果decltype使用的表达式是一个变量,则decltype返回该变量的类型。

#include <iostream>
using namespace std;
int main()
{
	int a = 0,&b = a;
	decltype (a) x = 0;
	decltype (b) y = x;
	cout << "x:" << x << endl;
	cout << "y:" << y << endl;
	y = 100;
	cout << "x:" << x << endl;
	cout << "y:" << y << endl;
	return 0;
}
其中 x的类型是int
    y的类型是int&。
运行结果(得到y是引用类型,所以可以通过y改变x的值):

decltype和引用
如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。

#include <iostream>
using namespace std;
int main()
{
<span style="white-space:pre">	</span>int a = 0,*p = &a;
<span style="white-space:pre">	</span>decltype (a + 10) b = 3.3;
<span style="white-space:pre">	</span>decltype (*p) c = a;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>cout << "a:" << a << endl;
<span style="white-space:pre">	</span>cout << "b:" << b << endl;
<span style="white-space:pre">	</span>cout << "c:" << c << endl;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>c = 300;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>cout << "a:" << a << endl;
<span style="white-space:pre">	</span>cout << "b:" << b << endl;
<span style="white-space:pre">	</span>cout << "c:" << c << endl;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>return 0;
}
其中b的类型是表达式a+10的类型,即为int。

c的类型是表达式*p的类型,即为const int &。
运行结果:



decltype的表达式如果加上括号(双层括号)则其返回的类型是引用,否则只有当表达式本身是引用的时候,返回值才是引用。

#include <iostream>
using namespace std;
int main()
{
	int i = 0;
	decltype ((i)) a = i;
	cout << "a:" << a << endl;
	cout << "i:" << i << endl;
	a = 20;
	cout << "a:" << a << endl;
	cout << "i:" << i << endl;
	
	decltype (i) b = i;
	cout << "b:" << b << endl;
	cout << "i:" << i << endl;
	
	b = 30;
	cout << "b:" << b << endl;
	cout << "i:" << i << endl;
	
	return 0;
}


运行结果:


由上面的例子就可以看出

定义a和b的时候的差别只在多一对括号而已,然而得到的a和b的类型却截然不同。

其中a是int&类型,改变a的值就是改变了i的值。而b是int型的,改变了b的值与i无关,b与i的

唯一关系就是他们都是int型而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值