C++11 auto与decltype类型推导详解
请详细说明C++11中auto和decltype的类型推导规则,包括auto的引用与cv限定符推导、decltype的括号表达式特殊规则、以及auto与decltype的典型协作用法(返回类型后置)。
回答
我还是少年
auto推导规则(与模板参数推导一致):
- auto忽略引用和顶层cv限定符(除非声明为auto&/const auto),例如
const int& x=1; auto y=x;→ y为int。 - 数组/函数退化为指针。
- C++14后auto可作函数返回类型、Lambda参数。
decltype规则:
decltype(expr):若expr为无括号的标识符或类成员访问,则推导为其声明类型;否则若expr为左值,推导为T&;若为右值,推导为T;若为将亡值,推导为T&&。- 关键陷阱:
int x; decltype((x))→ int&(加括号后为左值表达式)。
协作用法(返回类型后置):
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) { return t + u; }
C++14后可直接auto add(T t, U u) { return t + u; }。