我是靠谱客的博主 超帅摩托,这篇文章主要介绍c++浅谈decltype类型指示符,现在分享给大家,希望可以做个参考。

decltype类型指示符相当于auto指示符的改进版,使用此类型指示符能让被定义变量的类型指定为程序中已有,而我们不好直接写出的(比如某个函数的输出结果有多种数据类型的可能,而下面我们要定义的变量类型需与函数返回值类型一致),便可以使用decltype类型指示符。

例如:

复制代码
1
2
decltype (f()) sum=x;//sum的类型为函数f的返回类型

应注意,在其他类型指示符下,引用都作为所指对象同义词出现,但用在decltype下,引用类型由decltype()括号中的引用类型决定。

例如:

复制代码
1
2
3
4
const int ci=0, &cj=ci; decltype(ci) x=0;//x是 decltype(cj) y=x;//y是const int&类型的引用,引用必须赋初值

如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型,出现这种情况说明表达式结果对象能作为一条赋值语句的左值。

如:

复制代码
1
2
3
4
int i=42,*p=&i,&r=i; decltype(r) b=i;//这样直接使用r的话由于r是个引用,定义的b也是int &类型的 //引用,就需要赋初值。

但如果想让结果是r所指向的类型而非r的类型,即想让结果为数值而非引用,则需将r作为表达式的一部分,即:

复制代码
1
2
decltype(r+0) b;//这样就得到一个不需要初始化的int类型变量b了

此外,如果表达式内容为解引用操作,,则decltype将得到引用类型。因为解引用指针将得到指针所指的对象,并且可以给该对象赋值。

复制代码
1
2
3
4
decltype(*p) c=i;//解引用后得到的类型为int &,需要赋初值 //这里的解引用可以通俗的理解为,定义指针p指向&i,则p表示&i的地址,*p表示的 //就是&i本身,这样decltype得到的就是int &类型

还有很重要的一点需要注意,对于decltype使用的表达式,若不在表达式外加括号,则得到的结果是该变量类型;若在表达式外还有一对括号,则编译器将其视为可作赋值语句左值的特殊表达式,在c++中,若表达式为赋值语句如i=x,则该表达式的类型为引用类型(若i为int,则decltype(i=x)的类型为int &类型),因此,在编译器将双括号语句视为赋值语句时,decltype将会得到引用类型。

复制代码
1
2
3
decltype((i)) d=i;//表达式"i"外还有一对括号,得到的是引用类型int & decltype(i) e;//无括号,得到i的变量类型int

decltype(( ))的类型永远是引用,decltype()的结果只有当表达式本身是一个引用时才是引用

最后

以上就是超帅摩托最近收集整理的关于c++浅谈decltype类型指示符的全部内容,更多相关c++浅谈decltype类型指示符内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(115)

评论列表共有 0 条评论

立即
投稿
返回
顶部