auto会忽略顶层const,保留底层const
int i = ;
const int* const p = &i;
auto p2 = p; //p2是const int*,不是const int* const
//*p2 = 4; //错误,p指向常量
p2 = nullptr; //正确,p2本身不是常量
auto不会保留引用类型,应该使用auto&
int& x = i;
auto m = x; //m是int,不是int&
auto& n = x; //n是int&
decltype(variable)回保留顶层const和底层const
decltype(p) p3 = p; //p3是const int* const
//*p3 = 4; //错误
//p3 = nullptr; //错误
decltype也会保留引用类型,decltype((variable)) 双括号的结果永远是引用
int* p = &i;
decltype(*p) r = i; //解引用指针得到引用类型
decltype((i)) r = i; //引用
decltype(r+) b; // 通过r+0可以得到int
decltype(*p+) c; //意思同上
用auto和decltype定义复杂的函数返回类型
int array[]; //array数组,下面定义一个函数,返回这个数组的指针
int (* func())[]; //以前的定义方法
auto func2()->int(*)[]; //C++11 尾置返回类型(星号必须加括号)
decltype(array)* func3(); //用decltype
定义函数指针
int fun(int); //函数,下面定义函数指针
int (*ffun)(int); //以前的方法
auto f1(int)->int(*)(int); //用auto
decltype(fun)* f2(int); //用decltype
decltype(x) z = i;
z=;
cout<<i<<endl; // i=1986