C++ 新特性:auto

此文为转发

链接:http://blog.csdn.net/huang_xw/article/details/8760403

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

1. 自动类型推断

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

[cpp] view plaincopyprint?

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

2. 返回值占位

[cpp] view plaincopyprint?

  1. template <typename T1, typename T2>
  2. auto compose(T1 t1, T2 t2) -> decltype(t1 + t2)
  3. {
  4. return t1+t2;
  5. }
  6. auto v = compose(2, 3.14); // v‘s type is double

3.使用注意事项

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

[cpp] view plaincopyprint?

  1. auto k = 5;
  2. auto* pK = new auto(k);
  3. auto** ppK = new auto(&k);
  4. const auto n = 6;

②用auto声明的变量必须初始化

[cpp] view plaincopyprint?

  1. auto m; // m should be intialized

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

[cpp] view plaincopyprint?

  1. auto int p; // 这是旧auto的做法。

④函数和模板参数不能被声明为auto

[cpp] view plaincopyprint?

  1. void MyFunction(auto parameter){} // no auto as method argument
  2. template<auto T> // utter nonsense - not allowed
  3. void Fun(T t){}

⑤定义在堆上的变量,使用了auto的表达式必须被初始化

[cpp] view plaincopyprint?

  1. int* p = new auto(0); //fine
  2. int* pp = new auto(); // should be initialized
  3. auto x = new auto(); // Hmmm ... no intializer
  4. auto* y = new auto(9); // Fine. Here y is a int*
  5. auto z = new auto(9); //Fine. Here z is a int* (It is not just an int)

⑥以为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转换或其他一些操作,如sizeof和typeid

[cpp] view plaincopyprint?

  1. int value = 123;
  2. auto x2 = (auto)value; // no casting using auto
  3. auto x3 = static_cast<auto>(value); // same as above

⑦定义在一个auto序列的变量必须始终推导成同一类型

[cpp] view plaincopyprint?

  1. auto x1 = 5, x2 = 5.0, x3=‘r‘;  // This is too much....we cannot combine like this

⑧auto不能自动推导成CV-qualifiers(constant & volatile qualifiers),除非被声明为引用类型

[cpp] view plaincopyprint?

  1. const int i = 99;
  2. auto j = i;       // j is int, rather than const int
  3. j = 100           // Fine. As j is not constant
  4. // Now let us try to have reference
  5. auto& k = i;      // Now k is const int&
  6. k = 100;          // Error. k is constant
  7. // Similarly with volatile qualifer

⑨auto会退化成指向数组的指针,除非被声明为引用

[cpp] view plaincopyprint?

  1. int a[9];
  2. auto j = a;
  3. cout<<typeid(j).name()<<endl; // This will print int*
  4. auto& k = a;
  5. cout<<typeid(k).name()<<endl; // This will print int [9]
时间: 2024-10-12 06:33:11

C++ 新特性:auto的相关文章

C++新特性-auto关键字

1 auto关键字 在介绍之前,我们先来了解一个新增的关键字auto. 在C++11中,如果编译器能够在变量的声明时,能够推断出其类型:那么,代替之前必须把变量类型放在声明之前的做法,可以直接用auto进行变量的声明: int x = 4; 也就是说,上面的声明语句可以被下面的语句替代: auto x = 4; 当然了,这肯定不是auto关键字设计的根本目的.它最大的作用还是和模板及容器配合使用: vector<int> vec; auto itr = vec.iterator(); // 代

【C++11】新特性——auto的使用

转自 http://blog.csdn.net/huang_xw/article/details/8760403 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后两个标准的auto,完全是两个概念. 1. 自动类型推断 auto自动类型推断,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推断,可以大大简化我们的编程工作.下面是一些使用auto的例子. [cpp] vi

【C++11】新特性——Lambda函数

本篇文章由:http://www.sollyu.com/c11-new-lambda-function/ 文章列表 本文章为系列文章 [C++11]新特性--auto的使用 http://www.sollyu.com/c11-new-features-auto/ [C++11]新特性--Lambda函数 http://www.sollyu.com/c11-new-lambda-function/ 说明 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find,用户经常

c++11 新特性之 auto关键字

C++11是对目前C++语言的扩展和修正.C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. g++编译c++11命令加上 -std=c++11 C++11中引入auto第一种作用是为了自动类型推导 auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作 auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响另外,似乎auto并不会影响编译速度,

WWDC2016 Session笔记 – Xcode 8 Auto Layout新特性

来源:一缕殇流化隐半边冰霜(@halfrost) 链接:http://t.cn/Rt7sKBv 目录 1.Incrementally Adopting Auto Layout 2.Design and Runtime Constraints 3.NSGridView 4.Layout Feedback Loop Debugging 一.Incrementally Adopting Auto Layout Incrementally Adopting Auto Layout是什么意思呢?在我们IB

iOS之Xcode8 Auto Layout新特性

目录 1.Incrementally Adopting Auto Layout 2.Design and Runtime Constraints 3.NSGridView 4.Layout Feedback Loop Debugging 一.Incrementally Adopting Auto Layout Incrementally Adopting Auto Layout是什么意思呢?在我们IB里面布局我们的View的时候,我们并不需要一次性就添加好所有的constraints.我们可以一

C++11 新特性之 tuple

我们在C++中都用过pair.pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.pair可以使用make_pair构造 pair<int, string> p = make_pair(1, "a1"); 如果传入的参数为多个,那么就需要嵌套pair,如下代码 #include <iostream> #include <map> using namespace std; int main() { //<int, string,

【C++11】30分钟了解C++11新特性

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外). C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decl

[C++11新特性]第二篇

0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(int count, ...) { va_list ap; double sum=0; va_start(ap,count); for(int i=0;i<count;i++) sum+=va_arg(ap,double); va_end(ap); return sum; } int main() { p

h5新特性

  CSDN博客 Gane_Cheng HTML5新特性浅谈 发表于2016/10/17 21:25:58  7809人阅读 分类: 前端 转载请注明出处: http://blog.csdn.net/gane_cheng/article/details/52819118 http://www.ganecheng.tech/blog/52819118.html (浏览效果更好) 2014年10月29日,W3C宣布,经过接近8年的艰苦努力,HTML5标准规范终于制定完成. HTML5将会取代