C++之auto与decltype

C++11中新增了两种推倒型别的方法,auto和decltype,从而我们的变量定义就方便了很多。

一、auto关键词是根据其初始化物的类型来推导的。

(1)推倒时忽略初始化物本身的const属性。如:

 int x=0;
 auto a=x,b=0;
 cout<<typeid(a).name()<<"\t"<<typeid(b).name()<<endl;

输出:

i  i(i代表int类型)

(2)若为指针或引用,保留其应指涉物的const属性。如:

 const int *p=0;
 int *q = 0;
 auto px = p;
 auto qx = q;
 cout<<typeid(px).name()<<"\t"<<typeid(qx).name()<<endl
const int &rx = x;
auto &mr = rx;   ///mr为引涉到const int类型的引用
++mr; ///错误

输出:

PKi(指向const int类型的指针)Pi(指向int类型的指针)

(3) 和一般定义语句一样,一个定义语句中可以定义多个变量,类型也可以不同,但必须具备相同的基本类型。如:

int x=0;
auto ax=x,*xp=&ax,**xxp=&xp;
cout<<typeid(ax).name()<<"\t"<<typeid(xp).name()<<typeid(xxp).name()<<endl;

输出:

i Pi PPi(指向int指针的指针),三者的基本类型都为int

const int ci=x;
auto *px=&x,*pci = &ci;
 ///错误,有&x推倒得到基本类型为int,而由&ci推倒得到基本类型为const int

(4)数组类型被推到为指针类型,函数类型被推倒为指向函数的指针类型。如:

int f(int i)
{

}

int iar[100];
auto aiar = iar;
auto af = f;

cout<<typeid(iar).name()<<"\t"<<typeid(aiar).name()<<endl;
cout<<typeid(f).name()<<"\t"<<typeid(af).name()<<endl;

输出:

A100_i Pi (指向长度为100的int数组 指向int类型的指针)

FiiE PFiiE  (参数为int,返回值为int的函数 指向参数为int,返回值为int的函数的指针

(5)引用类型推倒得的是其所绑定类型的对象。如:

int x=0;
int &m = x;
auto am = m;
 ++m;
 cout<<x<<"\t"<<m<<"\t"<<am<<endl;
++am;
 cout<<x<<"\t"<<m<<"\t"<<am<<endl;

输出:

1 10

1 11

(6)使用auto定义时,可以像普通定义一样,为其加上const修饰符

int x=0;
const int &m = x,*px = &x;  ///m和px为指涉向const int的引用和指针
cout<<x<<"\t"<<m<<"\t"<<*px<<endl; ///output:0  0   0
 ++x;
 cout<<x<<"\t"<<m<<"\t"<<*px<<endl;  ///output:1  1   1
++m;  ///错误
++*px;  ///错误

二、decltype根据所提供的对象进行推倒,但并不使用其作为初始化物。

(1)推倒时初始化物本身的const属性被保留,字面值推倒为变量。如:

 int x=0;
 const int z=0;
 decltype(x) dx=100;
 decltype(0) dy = 200;
 decltype(z) dz = 300;
 ++dx;
 ++dy;
 cout<<dx<<"\t"<<dy<<endl; ///output:101 201
 ++dz;  错误,dz被推倒为const类型

(2)指针或引用的引涉类型const属性被保留。如:

  int x;
  const int *p = &x;
  decltype(p) dp = &x;  ///推倒得到指向const int类型的指针
  const int &rx = x;
  decltype(rx) drx = x; ///推倒得到绑定到const int类型的引用
  ///++(*p);
  ///++rx;

(3) 和一般定义语句一样,一个定义语句中可以定义多个变量,类型也可以不同,但必须具备相同的基本类型。

如:

int x;
decltype(x) *px=&x,&rx=x,m=x;

(4)数组和函数类型保持原有类型,不做指针转化。如:

int f(int i)
{

}
decltype(f) df;
int arr[100];
decltype(arr) dar;
cout<<typeid(df).name()<<"\t"<<typeid(arr).name()<<endl;
///output:FiiE  A100_i

(6)当为decltype提供的用来推倒类型的表达式为左值时,推倒得到表达式的引用类型,为右值时得到表达式的类型。如:

  int x=0;
  int *p = &x;
  ///得到int 引用类型
  ///decltype(*p) pt; 错误,引用类型必须初始化
  decltype(*p) pr = x;
  ++pr;
  cout<<x<<"\t"<<pr<<endl;  ///output:1   1
  ///由于*p+0是右值,因此可以通过下面的方法得到*p类型的对象
  decltype(*p + 0) rr;  ///ok
时间: 2024-12-30 12:09:01

C++之auto与decltype的相关文章

关于auto和decltype

1 auto会忽略顶层const,保留底层const 2 3 int i = 0; 4 5 const int* const p = &i; 6 7 auto p2 = p; //p2是const int*,不是const int* const 8 //*p2 = 4; //错误,p指向常量 9 p2 = nullptr; //正确,p2本身不是常量 10 11 12 auto不会保留引用类型,应该使用auto& 13 14 int& x = i; 15 16 auto m = x

c++11 auto 与 decltype 详解

转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型.和原来那些只对应某种特定的类型说明符(例如 int)不同.auto 让编译器通过初始值来进行类型推演.从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值. [cpp] view plain co

C++11的auto和decltype关键字

今天Mayuyu要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已经就有了auto关键字,只不过在C++98中auto表示的是临时变量的语义,而在C++11中auto表示自动类型推导,如下 auto关键字可以从表达式中推导出变量的类型,这样就大大简化了编程人员的工作.而且auto是在编译时对变量进行了类型推导,所以不会对程序的效率造成影响,另外auto也不会对编译速度造成太大影响,因为编译时本身也要右侧推导后判断是否与左侧匹配. 另外auto在模板编程中也

C++ 11 学习1:类型自动推导 auto和decltype

Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译器并不是完全支持,比如我正在使用的vs2012.这里是msdn里面VS各版本对C++ 11 的支持 对 C++11 功能的支持(现代 C++) 1.auto auto这个关键字C++原先就有,用来指定存储器.因为很少有人去用这个东西,所以在C++11中就把原有的auto功能给废弃掉了,而变成了现在的

c++11 auto 和 decltype

一. auto简介编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型.和原来那些只对应某种特定的类型说明符(例如 int)不同.auto 让编译器通过初始值来进行类型推演.从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值. 1 //由val_1 和val_2相加的结果可以推断出it

【C++注意事项】5 Top-level const , The auto and decltype Type Specifier

top-level const As we've seen, a pointer is an object that can point to a different object. As a result, we can talk independently about whether a pointer is const and whether the objects to which it can point are const. we use the top-level const to

auto和decltype的用法总结

一, auto 1, auto的作用 一般来说, 在把一个表达式或者函数的返回值赋给一个对象的时候, 我们必须要知道这个表达式的返回类型, 但是有的时候我们很难或者无法知道这个表达式或者函数的返回类型. 这个时候, 我们就可以使用auto关键字来让编译器帮助我们分析表达式或者函数所属的类型. 比如: auto item = val1 + val2; auto red = LayerColor::create(Color4B(255, 100, 100, 255), 200, 100); 如果va

C++11之auto和decltype

auto自动类型推断,用于从初始表达式中推断出变量的类型. auto a; // 错误,没有初始化表达式,无法推断出a的类型 auto int a = 10; // 错误,auto临时变量的语义在C++ 11中已不存在 auto a = 10; auto c = 'A'; auto s("hello"); vector<int> vctTemp; auto it = vctTemp.begin(); auto ptr = [](){ cout << "

auto 和 decltype (C++11 新增)

红色字体为个人推断,可信度自辨. 蓝色字体为重点. auto类型说明符:使用auto时,编译器会分析表达式,并自动推算出变量所属类型.*auto变量必须有初值 原理:编译器通过 初值 来判断auto变量所属类型.具体匹配规则不清.但整形和浮点推断为int和double. 需要注意: 1)auto sz = 0, pi = 3.14;  // 错误.sz和pi的类型不一致. decltype类型指示符:得到表达式对应类型. 使用时机: 1)需要表达式对应类型,但不需要表达式的值. 2)需要函数返回