类型说明符 auto & 类型指示符 decltype
#include <iostream>
using namespace std;
/**
auto
1,类型说明符,让编译器自己去分析,通过初始值来推算变量的类型;
2.因此他的定义必须要有初始值
3.可以一行里定义多个变量,用逗号隔开。当然这些变量的类型必须一致
4.用引用变量去推断auto的类型时,会将引用的那个对象的类型作为auto的类型
5.auto会忽略掉顶层const.想要让他加上顶层的const,在aout的时候就加上
6.然鹅让人难受的是如果你用auto声明一个引用,他又会保持原变量的所有定义的类型
decltype:
1.有时候我们希望从一个变量推断出要定义的类型,但不想用这个变量来初始化这个要定义的变量,就用decltype
2.这时decltype他只单纯的判断其类型,并不会计算表达式的值,且貌似无法在判断类型前修改其表达式里变量的值
3,decltype在引用和const里他会全盘接受(完完全全和里面的变量,表达式的类型一样)
*/
auto a=1, b=a,*c=&a;
//auto d=1,e=1.1;//错误,必须是同一个类型
decltype(a++) ad=10,bd=ad,*cd=&ad;
//decltype(f()) wuliao;//并不运行函数,只推出函数的返回值
int &dd=a;
int const *const fd=&a;
decltype(dd) ed=b;//ed是一个引用必须给他赋初值
decltype(fd) gd=&a;//gd是一个int const *const
decltype(dd+1) hd=4;//虽然dd是一个引用,但是dd+1表达式是一个int型,所以hd是一个int
decltype(*cd) kd=a;//你以为你解引用了一个int,但他却是一个引用(int &)....
decltype((a)) id=a;//这个操作真是叫人窒息,多加一个括号就成引用了。和下面那个一样了,相当于强制给他搞了一个引用
decltype(a) &jd=a;
int main(void)
{
cout<<a<<endl;
44444//
const int &g=a;
auto f=g;
5555///
const int * const h=&a;
const int h2=3;
auto j=h;
auto j2=h2;
/**
按理来说,这里j推测的类型应该是和h一样
是const int *const,然而他掉了顶层const
想要让j达到和h一样的类型,在前面再加一个const
*/
j+=1;
// *j+=1;
j2++;
const auto j3=h;
// j3+=1;
// *j3+=1;
//6666666666//
auto &k=h;
// h++;
// *h+=1;
/
cout<<"qwe"<<endl;
return 0;
}
/*初次看到有大佬在C++里用auto还以为是c99里的自动
现在才知道这个用法 已经被删除了。。。
变成了上面的那个用法。。。。
*/