Loading [Contrib]/a11y/accessibility-menu.js

auto 和 decltype

 


1 auto

auto 的功能是类型推断,它使用的是模板类型推导的机制,auto 会被一个虚构的模板类型参数T替代,然后进行推断。

例如下面的 auto x = 5,编译器就会认为它有一个模板 func_for_x,从而去推断出T的类型。

1
2
3
4
template <typename T>
void func_for_x(T param);
 
auto x = 5;

然而在某些方面,auto 和模板类型推导存在着不同,当使用列表初始化时,auto 会将其推断为 std::initializer_list<int>。

1
auto x{1, 2, 3};

但是如果用模板类型推导是推导不出来的:

1
2
3
4
template<typename T>   
void f(T param);  
 
f({ 11, 23, 9 }); 

在C++14中允许 auto 作为返回类型,在该情况下 auto 又是使用的模板类型推导机制,也就说如果直接返回列表是会出错的。

1
2
3
auto createInitList(){
    return { 1, 2, 3 };  
}

  

2 decltype

需要某个表达式的返回值类型而又不想实际执行它时可以用decltype

1
2
3
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 @   Kayden_Cheung  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
历史上的今天:
2019-03-24 MapReduce实现PageRank算法(邻接矩阵法)
//目录
点击右上角即可分享
微信分享提示