首页 > 代码库 > C++11 - 类型推导auto关键字

C++11 - 类型推导auto关键字

<style type="text/css"></style><style type="text/css"></style> <style type="text/css"></style><style type="text/css"></style>

c++11中,auto关键字被作为类型自动推导关键字,借助于auto关键字,可对变量进行隐式的类型定义,即由编译器在编译期间根据变量的初始化语句,自动推断出该变量的类型.

1.基本用法 

(1)基本用法: auto 变量名 = 初值;

1
2
3
4
auto a = 1;  //a被推导为int类型的
auto b = new auto(2); //b被推导为int*
auto const *c = &a;
auto const *d = 3;

(2)在旧语法中,auto类型变量存储于栈区,static型变量存储于静态区,二者不能同时使用,但c++11的auto关键字已不再作为存储类型指示符

1
2
static auto i = 4;
auto int j; //error ,c++11中auto关键字已经不再作为存储类型指示符

(3)auto并不代表一个实际的类型声明,只是一个类型声明的占位符,使用auto声明的变量必须马上初始化,以让编译器推断出它的世纪类型,并在编译剪短将auto替换为真的类型.

1
auto k;//error

 

2.auto同指针或引用结合使用

(1)即使不把auto声明为指针,其也可以自动推导为指针类型

1
2
3
int a = 0;
auto *b = &a; //auto=int  b==>int*
auto c = &a   //auto=int* c==>int*

 (2)当表达式带有引用属性时,auto会抛弃其引用属性

1
2
auto &d = a;  //auto=int  d==>int&
auto e = a;   //auto=int  e==>int

 (3)当表达式带有CV限定,auto会抛弃其CV限定

1
2
auto const f = a;  //auto=int  f==>int const
auto g = f;        //auto=int  g==>int

 (4)但是如果auto和引用或指针结合使用,表达式的CV限定会被保留下来

1
2
3
auto const &h = a; //auto=int  h==>int const&
auto &i = h;       //auto=int const  i==>cosnt &
auto *j = &h;      //auto=int const  j==>int const*

 

 3.使用auto的限制
(1)auto不能用于函数的参数

1
2
void foo(int i){…}  //error,无法推导为int i = 10
foo(10)

(2)auto不能用于类的非静态成员变量
(3)auto不能用于模板的类型实参(模板的类型实参都是)

1
2
Dummy<int> d1;
Dummy<auto> d2 = d1; //error

(4)auto不能用于数组元素

1
2
int a[10];
auto b[10] = a;//error

 

C++11 - 类型推导auto关键字