类似于sizeof操作符,decltype也不需对其操作数求值。粗略来说,decltype(e)返回类型前,进行了如下推导:
1.若表达式e指向一个局部变量、命名空间作用域变量、静态成员变量或函数参数,
那么返回类型即为该变量(或参数)的“声明类型”;
2.若e是一个左值(lvalue,即“可寻址值”),则decltype(e)将返回T&,其中T为e的类型;
3.若e是一个x值(xvalue),则返回值为T&&;
4.若e是一个纯右值(prvalue),则返回值为T。
const int i=0 ; ///decltype(i) is const int bool func(const Widget & w)//widget is a class ///decltype(w) is const Widget & ///decltype(func) is bool * (const Widget&) struct Point{ int x,y; }; ///decltype(Point::x ) is int Widget x; ///decltype(w) is Widget if(func(w)) ; ///decltype( func(w) ) is bool vector<int> v; if( v[0] == 0 ); /// ***decltype(v[0]) is int& ***