decltype关键字:
1.计算表达式的类型 sizeof操作符的值是一个整数,表示类型的长度(字节数) typeid操作符的值是一个对象,其中包含了类型的信息 decltype操作符的值是一个类型,可用于其它对象的声明1 #include2 #include 3 using namespace std; 4 int main (void) 5 { 6 int a = 0; 7 //int b = 1; 8 //auto b = a; 9 //b:int,decltype的值就是表达式的类型本身10 decltype (a) b = 1;11 cout << typeid (b).name () << endl; // i12 // c:int,decltype只在编译期计算表达式的类型,不在运行期计算表达式的值13 decltype (a++) c = 2;14 cout << typeid (c).name () << endl; // i15 cout << a << endl; // 016 int const& d = a;17 // e:int const&,decltype会保留表达式的引用属性和CV限定18 decltype (d) e = d;19 cout << &e << ' ' << &a << endl; // 地址相同20 /* e带有常属性21 cout << ++e << endl; */22 //f:int,auto会丢弃表达式的引用属性和CV限定23 auto f = d;24 cout << &f << ' ' << &a << endl; // 地址不同25 cout << ++f << endl; // 126 //g:int*,h:int**,decltype可以和指针联用27 decltype (a) *g= &a, **h = &g;28 cout << typeid (g).name () << endl; // Pi29 cout << typeid (h).name () << endl; // PPi30 // h---->g---->a31 //int** int* int32 //i:int const&,decltype可以和引用以及CV限定联用33 decltype (a) const& i = a;34 cout << &i << ' ' << &a << endl; // 地址相同35 /* i带有常属性36 cout << ++i << endl; */37 return 0;38 }
2.对于函数表达式,decltype将返回该函数返回值的类型,对于左值表达式,decltype返回该表达式的左值引用
1 #include2 #include 3 using namespace std; 4 int max (int x, int y) 5 { 6 return x < y ? y : x; 7 } 8 int* max (int* x, int* y) 9 {10 return *x < *y ? y : x;11 }12 int const& min (int const& x, int const& y)13 {14 return x < y ? x : y;15 }16 int main (void) 17 {18 int a = 123, b = 456;19 decltype (max (a, b)) c;20 cout << typeid (a).name () << endl; // i21 decltype (max (&a, &b)) d = NULL;22 cout << typeid (d).name () << endl; // Pi23 // e:int&24 decltype (++a) e = a;25 --e; // --a;26 cout << a << endl; // 12227 // f:int28 decltype (b++) f = b;29 --f;30 cout << b << endl; // 45631 // g:int&32 decltype (a = b) g = a;33 --g;34 cout << a << endl; // 12135 // h:int36 decltype (b + a) h = b;37 --h;38 cout << b << endl; // 45639 // i:int40 decltype (a) i = a; 41 // j:int&42 decltype ((a)) j = a;//decltype的表达式如果是加上了括号的变量,结果将是引用43 cout << &i << ' ' << &j << ' ' << &a << endl;44 return 0;45 }
注意:decltype((variable))(注意是双层括号)的结果永远是引用, 而decltype(variable)的结果只有当variable本身是一个引用时才是引用3.何时使用decltype
#include#include #include #include