首页 > 编程语言 >C++11学习之auto

C++11学习之auto

时间:2023-05-14 10:45:21浏览次数:52  
标签:11 变量 auto C++ 关键字 类型 声明

原文链接: http://blog.csdn.net/xiejingfa/article/details/50469045

 

熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如python,可以直接声明变量,在运行时进行类型检查。随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今天要介绍的auto关键字。

C++是一种强类型语言,声明变量时必须明确指出其类型。但是,在实践中,优势我们很难推断出某个表达式的值的类型,尤其是随着模板类型的出现,要想弄明白某些复杂表达式的返回类型就变得更加困难。为了解决这个问题,C++11重新定义了auto关键字的语义,用于进行自动类型推断。为什么说“重新定义”呢?auto关键字在C++98中已经出现,用于自动变量的声明,但是极少被使用(关于此定义,可以查看这里)。


用法

C++引入auto关键字主要有两种用途:一是在变量声明时根据初始化表达式自动推断该变量的类型,二是在声明函数时作为函数返回值的占位符。对于自动类型推断,C++11中也有一个类似的关键字decltype,感兴趣的童鞋可以继续关注我的博客,今天我们主要来讲解一些auto关键字的用法。

自动类型推断

使用auto从初始化表达式中推断出变量的数据类型,可以大大简化我们的编程工作,特别是对于一些类型冗长复杂的变量。比如,在以前的做法中,对于vector类型的变量,如果我们需要获取它的迭代器,我们需要这样声明vector::iterator iter,而使用auto关键字后我们可以让编译器帮我们推断出迭代器的具体类型。另外,在模板函数定义时,如果变量的类型依赖于模板参数,我们也很难确定变量的类型,使用auto关键字则可以把这些“脏活累活”交给编译器完成。

下面看一些简单的例子:

#include <iostream>
#include <vector>
using namespace std;

template<class T, class U>
void add(T t, U u)
{
    auto s = t + u;
    cout << "type of t + u is " << typeid(s).name() << endl;
}

int main()
{
    // 简单自动类型推断
    auto a = 123;
    cout << "type of a is " << typeid(a).name() << endl;
    auto s("fred");
    cout << "type of s is " << typeid(s).name() << endl;

    // 冗长的类型说明(如迭代器)
    vector<int> vec;
    auto iter = vec.begin();
    cout << "type of iter is " << typeid(iter).name() << endl;

    // 使用模板技术时,如果某个变量的类型依赖于模板参数,使用auto确定变量类型
    add(101, 1.1);
}

函数返回值占位符

在这种情况下,auto主要与decltype关键字配合使用,作为返回值类型后置时的占位符。此时,关键字不表示自动类型检测,仅仅是表示后置返回值的语法的一部分。

示例如下:

template<class T, class U>
auto add(T t, U u) -> decltype(t + u) 
{
    return t + u;
}

注意事项

1、使用auto关键字的变量必须有初始值。

2、可以使用valatile,*(指针类型说明符),&(引用类型说明符),&&(右值引用)来修饰auto关键字。

    auto a = 10;
    auto *pa = new auto(a);
    auto **rpa = new auto(&a);
    cout << typeid(a).name() << endl;   // 输出: int
    cout << typeid(pa).name() << endl;  // 输出: int *
    cout << typeid(rpa).name() << endl; // 输出: int **

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

4 、使用auto关键字声明变量的类型,不能自动推导出顶层的CV-qualifiers和引用类型,除非显示声明。例如:

  • 使用auto关键字进行类型推导时,如果初始化表达式是引用类型,编译器会去除引用,除非显示声明。例如:
    int i = 10;
    int &r = i;
    auto a = r;
    a = 13; // 重新赋值
    cout << "i = " << i << " a = " << a << endl;    // 输出i=10,a=13

    // 显式声明
    auto &b = r;
    b = 15; // 重新赋值
    cout << "i = " << i << " b = " << b << endl;    // 输出i=15,a=15
  • 使用auto使用auto关键字进行类型推导时,编译器会自动忽略顶层const,除非显示声明。例如:
    const int c1 = 10;
    auto c2 = c1;
    c1 = 11; // 报错,c1为const int类型,无法修改const变量
    c2 = 14; // 正确,c2为int类型

    // 显示声明
    const auto c3 = c1;
    c3 = 15; // 报错,c3为const int类型,无法修改const变量

5、对于数组类型,auto关键字会推导为指针类型,除非被声明为引用。例如:

    int a[10];
    auto b = a;
    cout << typeid(b).name() << endl;   // 输出:int *

    auto &c = a;
    cout << typeid(c).name() << endl;   // 输出:int [10]

标签:11,变量,auto,C++,关键字,类型,声明
From: https://www.cnblogs.com/qianqiannian/p/17398858.html

相关文章

  • 2.11 换分币
    问腿:将五元人民币兑换成一元,五角和一角的硬币,共有多少种不同的兑换方式解答流程图程序#include<stdio.h>intmain(){intx,y,z,count=1;printf("可能的兑换方法如下:ln");for(x=0;x<=50;x+=10)/*x为1元硬币钱数,其取值为0,10,20,30,40,50*./for(y=0;y<=50-x;y+=5)......
  • 记一个maven编译打包低级错误"Fatal error compiling: 无效的目标发行版: 11"的解决
    昨天遇到一个java8迁移到java11的项目编译问题,错误如下:[ERROR]Failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile(default-compile)onprojectxxxxx:Fatalerrorcompiling:无效的目标发行版:11->[Help1]初以为是spring或maven......
  • 11种概率分布的拟合与ks检验,可用于概率分析,可靠度计算等领域
    11种概率分布的拟合与ks检验,可用于概率分析,可靠度计算等领域案例中提供11种概率分布,具体包括:gev、logistic、gaussian、tLocationScale、Rayleigh、Loglogistic、Lognormal、GeneralizedPareto、Weibull、Gamma、Exponential等概率分布然后进行ks检验,选择最优概率分布,并画出11中概......
  • c++ class类bfs模板题目
    题目网址:走迷宫-题目-Liuser'sOJ(cpolar.cn)原本代码(bfs广度优先搜索):#include<bits/stdc++.h>usingnamespacestd;constintN=50;intn,m;intsx,sy;chara[N][N];intb[N][N];boolvis[N][N];intdx[]={1,0,-1,0};intdy[]={0,-1,0,1};structnode{i......
  • P1134高精度
    #include<bits/stdc++.h>usingnamespacestd;intmain(){intN;while(cin>>N){inta[3001]={0};inti=0;a[0]=1;while(N){for(i=0;i<3001;i++){......
  • 超微 X11SCA-F 主板 TrueNAS 系统中找不到核显解决办法
    问题表现:执行lspci|grep-ivga显示只有主板集成的ASPEED显示芯片07:00.0VGAcompatiblecontroller:ASPEEDTechnology,Inc.ASPEEDGraphicsFamily(rev41)解决办法:设置BIOS->Advanced->ChipsetConfiguration->SystemAgent(SA)Configuration->Graphic......
  • 南桥杯C++AB组:递归
    目标:200到300道;目前:已学知识点:本文概述:cin|cout对比scanf|printf的区别使用前者,由于其有缓冲池,相对于后者,响应时间会长很多分析递归所有递归,都可以转化为一棵递归搜索树;......
  • 11-13
    4.111.创建角色r2,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限 2.将这个角色授予u1u2u3。使他们具有角色R1所包含的全部权限3.一次性通过R1来回收王平的这3个权限  4.12使角色R2在原来的基础上增加student表中delete权限 4.13使r2减少select权限 ......
  • P1121
    #include<bits/stdc++.h>usingnamespacestd;constintmaxn=206;intn[maxn],m[maxn],ans[maxn];intmain(intargc,charconst*argv[]){stringa,b;while(cin>>a>>b){for(inti=0;i<maxn;i++)ans[i]=0;intl......
  • P1120
    #include<stdio.h>#include<string.h>intmain(){inta[201]={0},b[201]={0};charc[201]={'\0'},d[201]={'\0'};//*字符数组用来储存输入的两个大整数while(gets(c))//*多组输入{gets(d);i......