C++11:"auto"和"decltype"类型说明符的思考

<span style="font-family: Arial, Helvetica, sans-serif;">//例1</span>
<span style="font-family: Arial, Helvetica, sans-serif;">//编译器:gcc 4.8.1 系统:windows</span>
#include  <iostream>
int main()
{
	int i = 1;
	auto a = i;
	decltype(i) d = 2;
	
	std::cout << "a: " << a << std::endl;
	std::cout << "d: " << d << std::endl;
	
	return 0;
	
}

输出

</pre><pre name="code" class="cpp">a: 1
d: 2

由上可以看出”auto“和”decltype“都可以用来帮我们定义一个变量。

对于一个表达式,却不知道表达式的值的类型:

1.当我们想要赋值的时候,可以用”auto“;

2.当我们想要使用这个表达式的类型来定义一个变量的时候,可以用”decltype“;

共同点:

由例1基本类型的一般定义,”auto“和”dectype“还是共同的。

我们来看看复合类型指针;

例2:

#include  <iostream>
int main()
{
	int i = 1, r1 = 2, *p = &i;
	auto a = p;
	decltype(p) d = &r1;
	
	std::cout << "a: " << *a << std::endl;
	std::cout << "d: " << *d << std::endl;
	
	return 0;
	
}
输出:

a: 1
d: 2
可以看出对指针的处理,总的而言对于未”const“的类型,两者还是类似的。

区别:

我们来看看对顶层”const“的处理;

例3:

#include  <iostream>
int main()
{
	const int i = 1;
	auto a = i;  //会自动忽略顶层const,变为整形
	a = 2;
	decltype(i) d = 3; //d的类型是 const int;
	
	std::cout << "a: " << a << std::endl;
	std::cout << "d: " << d << std::endl;
	
	return 0;
	
}
输出:

a: 2
d: 3
可以看出”auto“会自动忽略顶层const 的特性;我们再给d赋值试试

例4:

#include  <iostream>
int main()
{
	const int i = 1;
	auto a = i;  //会自动忽略顶层const,变为整形
	a = 2;
	decltype(i) d = 3; //d的类型是 const int;
	d = 4;
	
	std::cout << "a: " << a << std::endl;
	std::cout << "d: " << d << std::endl;
	
	return 0;
	
}

输出:报错

D:\Project\a.cpp:8:4: error: assignment of read-only variable 'd'
  d = 4;

可以看出,”decltype“会保留顶层const的特性。

现在再来看看对引用的处理

#include  <iostream>
int main()
{
	const int i = 1, &r1 = i;
	auto a = r1;  //r1是i的别名,会自动忽略顶层const,变为整形
	a = 2;
	decltype(r1) d = 3; //d的类型是 const int;
	
	std::cout << "a: " << a << std::endl;
	std::cout << "d: " << d << std::endl;
	
	return 0;
	
}
输出:

a: 2
d: 3
和我们上面得出的结论类似。

decltype对表达式和引用的特殊处理

#include  <iostream>
int main()
{
	int i = 1, &r1 = i;
	decltype(r1 + 0) d ; //加法的结果是int
	d = 1;
	int j = 2;
	decltype((i)) d1 = j; //多加一个括号,表示的是引用 int&
	
	std::cout << "d: " << d << std::endl;
	std::cout << "d1: " << d1<< std::endl;
	
	return 0;
	
}
输出:

d: 1
d1: 2


啊仙的c++修行之路,参考《c++ primer》第五版 ,学到第二章了。










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值