decltype 与 auto
二者都用于声明变量类型,auto 通过初始值判定变量类型,decltype通过()中表达式返回值类型或变量类型决定变量类型。
decltype与引用
-
decltype(f()) 其中并非真的执行f()函数,而是使用f()返回值的类型。
-
decltype(a) ,若为变量时,引用和const都会连带变量类型返回。
-
表达式为解引用操作会返回引用类型,如decltype(*p) a=b;(p为int类指针),此时a为int & ,需要有初始值且类型相同的变量b(int)。
-
当变量加(),即decltype((b)) d=a; 此时返回类型为引用类型,int&;
-
当表达式为赋值操作,如decltype(a=b),decltype(a=4),时,返回引用类型。
auto与引用
-
auto 定义的变量必须有初始值,且一条声明语句中只有一个基本数据类型,即语句中所有变量的初始数据类型一致。
-
auto的初始化对象为引用对象时,auto 一般忽略掉顶层const,保留底层const; 如:const int a=4; auto b=a;(b为int) 而const int * c=&a; auto d=c;(d为const int * )
-
当设置 auto的引用时,顶层const和底层const都会保留下来!如:const int *const a=&b; auto &c=a;auto d=a;(c为const int *const,而d为const int *)
C++14 decltype(auto)
简化decltype()中表达式 和原用法原则完全相同,不会因auto对于顶层底层const的保留问题而有所变化。
例:const int a=4;
const int *const c=&a;
decltype© t=c;
decltype(auto) k=c;
这两种定义的变量均为const int *const 类型