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》第五版 ,学到第二章了。






 

 



 

posted @ 2016-01-07 09:52  Vzf  阅读(216)  评论(0编辑  收藏  举报