一般情况下不会有令人惊讶的行为:
const int i = 0; // decltype(i) is const int
bool f(const Widget& w); // decltype(w) is const Widget& decltype(f) is bool(const Widget&)
struct Point{
int x, y; // decltype(Point::x) is int
};
Widget w; // decltype(w) is Widget
if (f(w)) ... // decltype(f(w)) is bool
template<typename T> // simplified version of std::vector
class vector {
public:
...
T& operator[](std::size_t index);
...
};
vector<int> v; // decltype(v) is vector<int>
...
if(v[0] == 0) // decltype(v[0]) is int&
在C++11中, decltype 最主要的用处可能就是用来声明一个函数模板,在这个函数模板中返
回值的类型取决于参数的类型
template<typename Container, typename Index> // works, but
auto authAndAccess(Container& c, Index i) // requires
-> decltype(c[i]) // refinements
{
authenticateUser();
return c[i];
}
template<typename Container, typename Index> // C++14;
auto authAndAccess(Container &c, Index i) // not quite
{ // correct
authenticateUser();
return c[i];
} // return type deduced from c[i]
decltype 几乎总是得到一个变量或表达式的类型而不需要任何修改
对于非变量名的类型为 T 的左值表达式, decltype 总是返回 T&
C++14 支持 decltype(auto) ,它的行为就像 auto ,从初始化操作来推导类型,但是它推
导类型时使用 decltype 的规则