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的类型是inty的类型是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型而已。