概述
decltype类型指示符相当于auto指示符的改进版,使用此类型指示符能让被定义变量的类型指定为程序中已有,而我们不好直接写出的(比如某个函数的输出结果有多种数据类型的可能,而下面我们要定义的变量类型需与函数返回值类型一致),便可以使用decltype类型指示符。
例如:
decltype (f()) sum=x;//sum的类型为函数f的返回类型
应注意,在其他类型指示符下,引用都作为所指对象同义词出现,但用在decltype下,引用类型由decltype()括号中的引用类型决定。
例如:
const int ci=0, &cj=ci;
decltype(ci) x=0;//x是
decltype(cj) y=x;//y是const int&类型的引用,引用必须赋初值
如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型,出现这种情况说明表达式结果对象能作为一条赋值语句的左值。
如:
int i=42,*p=&i,&r=i;
decltype(r) b=i;//这样直接使用r的话由于r是个引用,定义的b也是int &类型的
//引用,就需要赋初值。
但如果想让结果是r所指向的类型而非r的类型,即想让结果为数值而非引用,则需将r作为表达式的一部分,即:
decltype(r+0) b;//这样就得到一个不需要初始化的int类型变量b了
此外,如果表达式内容为解引用操作,,则decltype将得到引用类型。因为解引用指针将得到指针所指的对象,并且可以给该对象赋值。
decltype(*p) c=i;//解引用后得到的类型为int &,需要赋初值
//这里的解引用可以通俗的理解为,定义指针p指向&i,则p表示&i的地址,*p表示的
//就是&i本身,这样decltype得到的就是int &类型
还有很重要的一点需要注意,对于decltype使用的表达式,若不在表达式外加括号,则得到的结果是该变量类型;若在表达式外还有一对括号,则编译器将其视为可作赋值语句左值的特殊表达式,在c++中,若表达式为赋值语句如i=x,则该表达式的类型为引用类型(若i为int,则decltype(i=x)的类型为int &类型),因此,在编译器将双括号语句视为赋值语句时,decltype将会得到引用类型。
decltype((i)) d=i;//表达式"i"外还有一对括号,得到的是引用类型int &
decltype(i) e;//无括号,得到i的变量类型int
decltype(( ))的类型永远是引用,decltype()的结果只有当表达式本身是一个引用时才是引用
最后
以上就是超帅摩托为你收集整理的c++浅谈decltype类型指示符的全部内容,希望文章能够帮你解决c++浅谈decltype类型指示符所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复