CodeWalk

C++11 auto与decltype类型推导详解

作者:我还是少年 · 2026-05-30 12:55

请详细说明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; }