C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念

1. 自动类型推断

auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,可以大大简化我们的编程工作。下面是一些使用auto的例子。

#include <vector>
#include <map> using namespace std; int main(int argc, char *argv[], char *env[])
{
// auto a; // 错误,没有初始化表达式,无法推断出a的类型
// auto int a = 10; // 错误,auto临时变量的语义在C++11中已不存在, 这是旧标准的用法。 // 1. 自动帮助推导类型
auto a = ;
auto c = 'A';
auto s("hello"); // 2. 类型冗长
map<int, map<int,int> > map_;
map<int, map<int,int>>::const_iterator itr1 = map_.begin();
const auto itr2 = map_.begin();
auto ptr = []()
{
std::cout << "hello world" << std::endl;
}; return ;
}; // 3. 使用模板技术时,如果某个变量的类型依赖于模板参数,
// 不使用auto将很难确定变量的类型(使用auto后,将由编译器自动进行确定)。
template <class T, class U>
void Multiply(T t, U u)
{
auto v = t * u;
}

2.返回占位符:

template <typename T1, typename T2>
auto compose(T1 t1, T2 t2) -> decltype(t1 + t2)
{
return t1+t2;
}
auto v = compose(, 3.14); // v's type is double

3.使用注意事项:

①我们可以使用valatile,pointer(*),reference(&),rvalue reference(&&) 来修饰auto

auto k = ;
auto* pK = new auto(k);
auto** ppK = new auto(&k);
const auto n = ;

②用auto声明的变量必须初始化(auto需要根据初始化的值推断出类型)

③auto不能与其他类型组合连用

=======================================================================

decltype
用于编译时推断类型,decltype有点像auto的逆过程:
  • 使用auto可以声明一个变量;
  • 而decltype可以通过一个变量得到类型。
在C++11可以使用trailing-return-type指定返回值类型,而在C++14中可以使用decltype(auto)这种更强大的语法,让程序员不再纠结返回值类型。
decltype 最主要用来声明一个函数模板,并且返回值的类型取决于参数的类型;(如上面第2点:返回占位符)

最新文章

  1. C#利用微软库完成设备网络定位(经纬度-地址)
  2. 懒人邮件群发日发50-100万封不打码不换IP不需发件箱大站协议系统营销软件100%进收件箱
  3. SQL Server常用命令
  4. Linq之Expression初见
  5. CocoaPods 教程 转载
  6. (转)log4j:WARN No appenders could be found for logger 解决方案
  7. J2SE知识点摘记(二十四)
  8. SQL SERVER中XML查询:FOR XML指定PATH
  9. SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务
  10. capwap学习笔记——初识capwap(五)(转)
  11. struts 学习03
  12. 三、数据API-3
  13. kafka清理数据日志
  14. Linux操作系统加固
  15. Java设计模式之八 ----- 责任链模式和命令模式
  16. C/C++的内存泄漏检测工具Valgrind memcheck的使用经历
  17. 整合Spring框架和Hibernate框架
  18. android获取view宽高的几种方法
  19. C++ Primer 5th 第18章 用于大型程序的工具
  20. Flask 对象关系

热门文章

  1. linux命令之数据盘格式化挂载
  2. 【C#/WPF】修改图像的DPI、Resolution
  3. C语言 &#183; 十六进制转八进制
  4. Android——基于监听器的事件处理(转)
  5. yii的一些方法的解析和blog的详细解析
  6. Logrotate日志轮巡missingok: 在日志轮循期间,任何错误将被忽略
  7. linux rename 和?????
  8. 判断DataTable某字段是否包含某值
  9. android ndk opencv jni 编译集成
  10. Openfire配置过程,以及与php交互注意事项。