C++11 auto 和 decltype 的区别

一、auto

我们在声明一个变量时,需要预先知道我们要声明的变量是什么类型,但有的变量类型是比较长

比较难以书写,或有的时候比较困难推演出表达式的类型,特别是在泛型模板编程中的时候

所以 C++11 就引入了 auto 类型说明符,让编译器去分析表达式所属的类型,因为编译器需要推算

表达式的类型,所以在使用 auto 的时候,必须要给它一个初始值!不然编译器不知道如何去推算


例如

int i = 0;    // i 为 int
auto a = 10;  // a 为 int
auto b = i;   // b 为 int
auto c;       // 错误,没有初始值

二、decltype

基于 auto ,有时候我们想知道从表达式中推算出要定义的变量类型,但是又不想用该表达式的值

作为初始化。这怎么办呢

为满足这要求,C++11 引入了第二个类型说明符 decltype !

decltype 的作用是选择并返回操作数的数据类型。

例如:

#include <iostream>
using namespace std;

// 测试函数
double Fun(int &a, int &b)
{
	return 0;
}

// 主函数
int main()
{	
	int x = 0;
	int y = 0;	
	decltype(0) a = 0;     // a 是 int
	decltype(x) b = 0;     // b 是 int
	decltype(Fun(x, y)) c; // c 是 double且非必要初始化  
	return 0;
}

三、auto 和 decltype 不同点

auto 和 decltype 功能类似,但有也一些不同的地方

#include <iostream>
using namespace std;

// 主函数
int main()
{	
	const int const_value = 10;               // const int
	const int &const_value1 = const_value;    // const int&

	int value = 10;        // int
	int &value2 = value;   // int&
	int *value3 = &value;  // int*

	// 测试1
	auto A1 = const_value;          // A1 为 int,auto 忽略了顶级const
	decltype(const_value) B1 = 0;   // B1 为 const int

	// 测试2
	auto A2 = const_value1;         // A2 为 int,auto 忽略了顶级const和引用
	decltype(const_value1) B2 = A1; // B2 为 const int&

	// 测试3
	auto A3 = value;				// A3 为 int
	decltype(value) B3;				// B3 为 int

	// 测试4
	auto A4 = value2;               // A4 为 int,auto 忽略了引用
	decltype(value2) B4 = value;    // B4 为 int&

	// 测试5
	auto A5 = *value3;			    // A5 为解引用后 int 类型
	decltype(*value3) B5 = value;   // A5 为 int&

	return 0;
}

以上可看出 auto 和 decltype 的区别在于 const 和非 const 与引用和非引用的区别
1.auto 会忽略顶级 const
2.auto 会忽略引用
3.auto 在表达式为解引用时,会返回解引用类型
4.decltype 在表达式为解引用时,会返回引用类

另外:declptye 还有个特别注意的地方

***注意1

declptye((exp)) : 恒定返回引用类型!
declptye(exp) : 只有 exp 是引用类型,才返回引用类型

***注意2

看以下代码

#include <iostream>
using namespace std;

int Fun(int& a, int& b)
{
	a = 0;
	b = 0;
	return 0;
}

// 主函数
int main()
{	
	int a = 5; int b = 3;

	decltype(Fun(a, b)) B;
	cout << "decltype 推算后 a 和 b 的值:\t a=" << a << ", b=" << b << endl;

	auto A = Fun(a, b);
	cout << "auto 推算后 a 和 b 的值:\t a=" << a << ", b=" << b << endl;

	return 0;
}

*调试结果:可以看到,decltype 是不会去执行 Fun 函数的,它就只会做类型的推算

四、_End

完事儿

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值