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 的一些特性

  1. auto定义的变量必须有初始值。
  2. auto会消除const和引用,decltype不会消除const和引用。
  3. C++14 中的decltype(auto)中的auto是一个占位符,相当于将表达式带入auto然后再用decltype规则进行推断。
posted @ 2022-03-24 14:26  Kayden_Cheung  阅读(76)  评论(0编辑  收藏  举报
//目录