C++11新特性之auto的使用_C 语言

前言

C++是一种强类型语言,声明变量时必须明确指出其类型。但是,在实践中,优势我们很难推断出某个表达式的值的类型,尤其是随着模板类型的出现,要想弄明白某些复杂表达式的返回类型就变得更加困难。为了解决这个问题,C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念。

一、自动类型推断

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 = 10;
 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 0;
}; 

// 3. 使用模板技术时,如果某个变量的类型依赖于模板参数,
// 不使用auto将很难确定变量的类型(使用auto后,将由编译器自动进行确定)。
template <class T, class U>
void Multiply(T t, U u)
{
 auto v = t * u;
} 

二、返回值占位

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

三、使用注意事项

1、我们可以使用valatilepointer(*)reference(&)rvalue reference(&&) 来修饰auto

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

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

auto m; // m should be intialized 

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

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

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

void MyFunction(auto parameter){} // no auto as method argument 

template<auto T> // utter nonsense - not allowed
void Fun(T t){} 

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

int* p = new auto(0); //fine
int* pp = new auto(); // should be initialized 

auto x = new auto(); // Hmmm ... no intializer 

auto* y = new auto(9); // Fine. Here y is a int*
auto z = new auto(9); //Fine. Here z is a int* (It is not just an int) 

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

int value = 123;
auto x2 = (auto)value; // no casting using auto 

auto x3 = static_cast<auto>(value); // same as above 

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

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

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

const int i = 99;
auto j = i; // j is int, rather than const int
j = 100 // Fine. As j is not constant 

// Now let us try to have reference
auto& k = i; // Now k is const int&
k = 100; // Error. k is constant 

// Similarly with volatile qualifer 

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

int a[9];
auto j = a;
cout<<typeid(j).name()<<endl; // This will print int* 

auto& k = a;
cout<<typeid(k).name()<<endl; // This will print int [9] 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用C++能有一定的帮助,如果有疑问大家可以留言交流。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c
, auto
, 11
, 11新特性
auto关键字
c 11新特性、c 11 新特性 pdf、freebsd11新特性、freebsd 11.0 新特性、ie11新特性,以便于您获取更多的相关知识。

时间: 2024-10-11 07:41:03

C++11新特性之auto的使用_C 语言的相关文章

C++11的新特性简单汇总介绍 (一)_C 语言

什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外). C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. 1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己

C++11的新特性简单汇总介绍 (二)_C 语言

1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; for(int x: vec) { cout<<x<<endl; } 2. 尾置返回类型 要想引入尾置类型,我们还得从复杂的类型声明说起.如果我们需要定义一个含有10个int元素的数组,一般是这样的: int arr[10] = {0}; 如果要定义指向这个数组的指针呢: 复制代码 代

浅析C++11新特性的Lambda表达式_C 语言

lambda简介 熟悉Python的程序员应该对lambda不陌生.简单来说,lambda就是一个匿名的可调用代码块.在C++11新标准中,lambda具有如下格式: [capture list] (parameter list) -> return type { function body } 可以看到,他有四个组成部分:     1.capture list: 捕获列表     2.parameter list: 参数列表     3.return type: 返回类型     4.func

C++ 11 新特性

C++ 11  新特性 类内成员赋初值 类内数据成员允许赋默认值. C11以前是会报错的.ISO C++ forbids initialization of member `name_var_' lambda表达式 lambda表达式本质上是一个未命名的内联函数. 很多语言都提供了 lambda 表达式,如 Python,Java 8.lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式,简化编程.l

《深入理解C++11:C++ 11新特性解析与应用》——第1章 新标准的诞生 1.1 曙光:C++11标准的诞生

第 1 章 新标准的诞生 从最初的代号C++0x到最终的名称C++11,C++的第二个真正意义上的标准姗姗来迟.可以想象,这个迟来的标准必定遭遇了许多的困难,而C++标准委员会应对这些困难的种种策略,则构成新的C++语言基因,我们可以从新的C++11标准中逐一体会.而客观上,这些基因也决定了C++11新特性的应用范畴.在本章中,我们会从设计思维和应用范畴两个维度对所有的C++11新特性进行分类,并依据这种分类对一些特性进行简单的介绍,从而一览C++11的全景. 1.1 曙光:C++11标准的诞生

《深入理解C++11:C++ 11新特性解析与应用》——1.2 今时今日的C++

1.2 今时今日的C++ 1.2.1 C++的江湖地位 如今C++依旧位列通用编程语言三甲,不过似乎没有以前那么流行了.事实上,编程语言排名通常非常难以衡量.比如,某位教授或学生用了C++来教授课程应该被计算在内吗?在新的联合攻击战斗机(Joint Strike Fighter,JSF-35)的航空电子设备中使用了C++编程应该计算在内吗?又或者C++被用于一款流行的智能手机操作系统的编程中算不算呢?再或者是C++被用于编写最流行的在线付费搜索引擎,或用于构建一款热门的第一人称射击游戏的引擎,或

C++11新特性:右值引用和转移构造函数

问题背景   [cpp] view plaincopy   #include <iostream>       using namespace std;       vector<int> doubleValues (const vector<int>& v)   {       vector<int> new_values( v.size() );       for (auto itr = new_values.begin(), end_itr 

C++11新特性

新的关键字 auto C++11中引入auto第一种作用是为了自动类型推导. auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以大大简化我们的编程工作.auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响.另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配.如果没有auto关键字 写个迭代器要写很长长,这也算是节省了我们的脑细胞吧. 1 2 3 4 5 6 7 8 9 10 auto

《深入理解C++11:C++ 11新特性解析与应用》——2.9 扩展的friend语法

2.9 扩展的friend语法 类别:部分人 friend关键字在C++中是一个比较特别的存在.因为我们常常会发现,一些面向对象程序语言,比如Java,就没有定义friend关键字.friend关键字用于声明类的友元,友元可以无视类中成员的属性.无论成员是public.protected或是private的,友元类或友元函数都可以访问,这就完全破坏了面向对象编程中封装性的概念.因此,使用friend关键字充满了争议性.在通常情况下,面向对象程序开发的专家会建议程序员使用Get/Set接口来访问类