c++ auto关键字使用

原创 2018年04月15日 15:08:10

C++11 auto

auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子:

    int a = 10;
    auto au_a = a;//自动类型推断,au_a为int类型
    cout << typeid(au_a).name() << endl;

typeid运算符可以输出变量的类型。程序的运行结果输出了

int

auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。例如上面的代码,编译的时候,就会把a变量转换为int类型。

auto和其他变量类型有明显的区别:

1.auto声明的变量必须要初始化,否则编译器不能判断变量的类型。

2.auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数


auto的用法

上面举的这个例子很简单,在真正编程的时候也不建议这样来使用auto,直接写出变量的类型更加清晰易懂。下面列举auto关键字的正确用法。

用于代替冗长复杂、变量使用范围专一的变量声明。

想象一下在没有auto的时候,我们操作标准库时经常需要这样:

#include<string>
#include<vector>
int main()
{
    std::vector<std::string> vs;
    for (std::vector<std::string>::iterator i = vs.begin(); i != vs.end(); i++)
    {
        //...
    }
}

这样看代码写代码实在烦得很。有人可能会说为何不直接使用using namespace std,这样代码可以短一点。实际上这不是该建议的方法(C++Primer对此有相关叙述)。使用auto能简化代码:

#include<string>
#include<vector>
int main()
{
    std::vector<std::string> vs;
    for (auto i = vs.begin(); i != vs.end(); i++)
    {
        //..
    }
}

for循环中的i将在编译时自动推导其类型,而不用我们显式去定义那长长的一串。

decltype

decltype关键字和auto相互对应的,它们经常在一些场所配合使用。decltype可以在编译的时候判断出一个变量或者表达式的类型,例如:

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

void func(auto can) {
    int a;
}

int main() {
    auto num = 1;  //num 是int类型
    decltype(num) num2 = num; //num2 也是int类型

    return 0;
}

这里decltype拿到了num的类型,然后用这个类型定义了num2做了num的一份copy。


注意事项

  • auto 变量必须在定义时初始化,这类似于const关键字。
  • 定义在一个auto序列的变量必须始终推导成同一类型。例如:

    auto a4 = 10, a5 = 20, a6 = 30;//正确
    auto b4 = 10, b5 = 20.0, b6 = 'a';//错误,没有推导为同一类型
    使用auto关键字做类型自动推导时,依次施加一下规则:
  • 如果初始化表达式是引用,则去除引用语义。

    int a = 10;
    int &b = a;
    
    auto c = b;//c的类型为int而非int&(去除引用)
    auto &d = b;//此时c的类型才为int&
    
    c = 100;//a =10;
    d = 100;//a =100;
  • 如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义。

    const int a1 = 10;
    auto  b1= a1; //b1的类型为int而非const int(去除const)
    const auto c1 = a1;//此时c1的类型为const int
    b1 = 100;//合法
    c1 = 100;//非法
  • 如果auto关键字带上&号,则不去除const语意。

    const int a2 = 10;
    auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int
    b2 = 10; //非法
    这是因为如何去掉了const,则b2为a2的非const引用,通过b2可以改变a2的值,则显然是不合理的。
  • 初始化表达式为数组时,auto关键字推导类型为指针。

    int a3[3] = { 1, 2, 3 };
    auto b3 = a3;
    cout << typeid(b3).name() << endl;

    程序将输出

    int *

  • 若表达式为数组且auto带上&,则推导类型为数组类型。

    int a7[3] = { 1, 2, 3 };
    auto & b7 = a7;
    cout << typeid(b7).name() << endl;

    程序输出

    int [3]

  • 函数或者模板参数不能被声明为auto

    void func(auto a)  //错误
    {
    //... 
    }
  • 时刻要注意auto并不是一个真正的类型。
    auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。

    cout << sizeof(auto) << endl;//错误
    cout << typeid(auto).name() << endl;//错误




C++之auto关键字

转载自:http://www.2cto.com/kf/201404/293503.html http://www.07net01.com/2015/07/880529.html 【在那些情况下要申...
  • liuweiyuxiang
  • liuweiyuxiang
  • 2016-05-30 00:07:07
  • 1667

C++ 深入理解 auto 关键字

auto类型变量——根据初始值推断真实的数据类型。本文将从,【为什么auto】【auto代码使用示例】【auto概念详解】【auto注意事项】【register/auto的比较分析】【auto类型(普...
  • u013630349
  • u013630349
  • 2015-07-23 15:29:35
  • 2773

【C++11新特性】 auto关键字

熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如python,可以直接声明变量,在运行时进行类型检查。随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今...
  • Xiejingfa
  • Xiejingfa
  • 2016-01-06 16:20:17
  • 6531

C++教程之auto关键字的使用

一、auto关键字的前世 从C语言开始,auto关键字就被当作是一个变量的存储类型修饰符,表示自动变量(局部变量)。它不能被单独使用,否则编译器会给出警告。 #include int ...
  • diveinedu
  • diveinedu
  • 2015-03-12 15:26:03
  • 1262

c++ auto类型用法总结

一、用途 auto是c++程序设计语言的关键字。用于两种情况 (1)声明变量时根据初始化表达式自动推断该变量的类型 (2)声明函数时函数返回值的占位符 二、简要理解 auto可以在声明变量...
  • xiaoquantouer
  • xiaoquantouer
  • 2016-06-12 17:37:50
  • 2191

C++11中auto 关键字、nullptr关键字和decltype关键字

C++11中auto 关键字、nullptr关键字和decltype关键字
  • wuqingshan2010
  • wuqingshan2010
  • 2016-08-11 15:56:50
  • 362

C++ 11 新关键字

C++ 11 新特性 a
  • chuchus
  • chuchus
  • 2014-07-16 22:31:44
  • 1731

Visual C++ 2010新功能之auto关键字

C语言里面其实就已经有auto关键字了,只不过很少用到,当我们在C或者以前的C++中,auto关键字基本上可以被无视:  比如这个局部变量: int a = 100; auto int a = 10...
  • u012512762
  • u012512762
  • 2014-11-03 10:18:42
  • 1177

c++: C++ auto 关键字的使用

1. auto定义auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子: int a = 10; auto au_a =...
  • DinnerHowe
  • DinnerHowe
  • 2018-04-03 16:06:51
  • 13

C++11 auto关键字介绍

在C++11中,auto关键字负责提示编译器对变量的类型进行自动推导。使用auto关键字能够增加代码的灵活度,减少代码的书写量。本文介绍了auto关键的注意事项,使用场景和推导规则....
  • WLFIGHTER
  • WLFIGHTER
  • 2015-12-27 16:09:16
  • 719
收藏助手
不良信息举报
您举报文章:c++ auto关键字使用
举报原因:
原因补充:

(最多只允许输入30个字)