auto 和 decltype
1 auto
auto 的功能是类型推断,它使用的是模板类型推导的机制,auto 会被一个虚构的模板类型参数T替代,然后进行推断。
例如下面的 auto x = 5,编译器就会认为它有一个模板 func_for_x,从而去推断出T的类型。
template <typename T> void func_for_x(T param); auto x = 5;
然而在某些方面,auto 和模板类型推导存在着不同,当使用列表初始化时,auto 会将其推断为 std::initializer_list<int>。
auto x{1, 2, 3};
但是如果用模板类型推导是推导不出来的:
template<typename T> void f(T param); f({ 11, 23, 9 });
在C++14中允许 auto 作为返回类型,在该情况下 auto 又是使用的模板类型推导机制,也就说如果直接返回列表是会出错的。
auto createInitList(){ return { 1, 2, 3 }; }
2 decltype
当需要某个表达式的返回值类型而又不想实际执行它时可以用decltype。
int a = 2, b = 3; auto c = a + b; decltype(a + b) d ;
另外 decltype 可用于声明返回值类型依赖于其参数类型的模板函数,即结合 auto 使用尾随返回类型。
3 auto 和 decltype 的一些特性
- auto定义的变量必须有初始值。
- auto会消除const和引用,decltype不会消除const和引用。
- C++14 中的decltype(auto)中的auto是一个占位符,相当于将表达式带入auto然后再用decltype规则进行推断。