C/C++教程

C++ decltype类型推导

本文主要是介绍C++ decltype类型推导,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、decltype介绍

decltype(declare type,声明类型)为C++11 新增的关键字,和auto功能一样,用于在编译期间进行自动类型推导。
auto和decltype关键字都可以自动推导出变量的类型,但他们的用法是有区别的:

auto varname = value;
decltype(exp) varname = value;

auto会根据=右边的初始值value推导出变量的类型,而decltype会根据exp表达式推导出变量的类型,跟=右边的value没有关系。
此外,auto会要求变量必须初始化,而decltype不要求;
PS:exp 注意事项

原则上讲,exp 就是一个普通的表达式,它可以是任意复杂的形式,但是我们必须要保证 exp 的结果是有类型的,不能是 void;

举例:

int a = 0;
decltype(a) b = 1;  //b 被推导成了 int
decltype(10.8) x = 5.5;  //x 被推导成了 double
decltype(x + 100) y;  //y 被推导成了 double

2、decltype推导规则

使用 decltype(exp) 获取类型时,编译器将根据以下三条规则得出结果:

  • 如果 exp 是一个不被括号( )包围的表达式,或者是一个类成员访问表达式,或者是一个单独的变量,那么 decltype(exp) 的类型就和 exp 一致,这是最普遍最常见的情况。
  • 如果 exp 是函数调用,那么 decltype(exp) 的类型就和函数返回值的类型一致。
  • 如果 exp 是一个左值,或者被括号( )包围,那么 decltype(exp) 的类型就是 exp 的引用;假设 exp 的类型为 T,那么 decltype(exp) 的类型就是 T&。

左值是指那些在表达式执行结束后依然存在的数据,也就是持久性的数据;右值是指那些在表达式执行结束后不再存在的数据,也就是临时性的数据。有一种很简单的方法来区分左值和右值,对表达式取地址,如果编译器不报错就为左值,否则为右值。

参考:http://c.biancheng.net/view/7151.html

这篇关于C++ decltype类型推导的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!