decltype(expression)是一个标识符或者表达式的数据类型的推断,它可以用在变量声明中作为变量的数据类型。decltype类型说明符常常和auto关键字一起用于模板库的开发。
语法
decltype( expression )
类型推断规则
- 如果 expression 参数是标识符或类成员访问,则 decltype(expression) 类型是 expression 命名的实体的类型。
- 如果 expression 参数是对一个函数或一个重载运算符函数的调用,则 decltype(expression) 是函数的返回类型。
- 如果 expression 参数是右值(rvalue),则 decltype(expression) 是 expression 类型。 如果 expression 参数是左值,则 decltype(expression) 是对 左值引用 类型的expression。
例子
int var;
const int&& fx();
struct A { double x; }
const A* a = new A();
表达式 | 类型 | 说明 |
---|---|---|
decltype(var) |
int | 返回变量标识符的类型 |
decltype(fx()) |
const int&& |
返回函数调用的返回类型 |
decltype((*a)) |
const A& |
表达式是左值,返回左值引用类型 |
decltype(a->x) |
double | 表达式是类成员访问,返回类成员对象的类型 |
decltype((a->x)) |
const double& |
内部表达式加上括号后,成为计算的表达式,而不是类成员访问;a是const指针,因此返回类型是const double& |
关于延迟指定函数返回类型惯用法
有时候函数的返回类型依赖于模板参数,这时可以借助于auto的延迟指定函数返回值的功能,常用于模板函数的定义中。
如:
template< typename T, typename U >
auto func(T t, U u) -> typename MaxType<T,U>::type
{
// ...
}