Dectype是C 11新增的一个关键字。其目的是选择并返回操作数的数据类型。重要的是,在这个过程中,编译器分析表达式并得到它的类型,但并不实际计算表达式的值。今天我们就通过这篇文章介绍一下C decltype的用法,通过示例代码非常详细的介绍给大家。请有需要的朋友参考一下。
1.什么是decltype
Decltype是C 11中新增的关键字,用于编译时期中的自动类型派生,就像auto的功能一样。引入Decltype是因为auto并不适用于所有自动类型派生方案。在某些特殊情况下,auto不方便使用,甚至根本无法使用。
对于内置类型的对象,使用decltype比较直观,但当参数为复合类型时,需要注意一些细节。
auto varName=value
decl type(exp)varName=value;
变量的类型由auto=右边的初始值导出,变量的类型由decltype的exp表达式导出,与=右边的值无关
Auto变量必须初始化,因为auto是根据变量的初始值来派生变量的类型的,如果不初始化,就不能派生变量的类型。
虽然decltype不是必需的,所以它可以写成如下形式
decl type(exp)varName;
原则上exp只是一个普通的表达式,可以是任何复杂的形式,但是必须保证exp的结果是类型化的,不能是void;如果exp是一个返回值为void的函数,那么exp的结果也是void类型,这将导致编译错误。
1.1 decl type的几种形式
int x=0;
decl type(x)y=1;//y - int
decl type(x y)z=0;//z - int
const int I=x;
decl type(I)j=y;//j - const int
const decl type(z)* p=z;//*p -常数int,p -常数int *
decl type(z)* pi=z;//*pi - int,pi - int *
decl type(pi)* PP=pi;//*pp - int *,pp - int * *
2.推导规则
decltype的推导规则可以简单概括如下:
如果exp是没有用括号()括起来的表达式,或者是类成员访问表达式,或者是单独的变量,则decltype(exp)的类型与exp一致。
如果exp是函数调用,则decltype(exp)的类型与函数返回值的类型相同。
如果exp是左值或者用括号()括起来,decltype(exp)的类型就是对exp的引用,假设exp是T类型,decltype(exp)就是T类型。
1规则示例:
#includestring
#includeiostream
使用命名空间std
A级
公共:
静态int total
字符串名称;
int age
浮动分数;
}
int A:total=0;
int main()
{
int n=0;
const int r=n;
A a
decl type(n)x=n;//n是Int,x派生为Int
decl type(r)y=n;//r为const int,y派生为const int。
decl type(A:total)z=0;///total是A类的int类型的成员变量,Z派生为int
decl type(a . name)URL=' www . Baidu . com ';//url是stringleix
返回0;
}
2规则示例:
int func1(int,char);//返回值是int
int func 2(void);//返回值是int
int func 3(double);//返回值是int
const int func4(int,int,int);//返回值是const int
const int func 5(void);//返回值是const int
int n=50
decltype(func1(100,' A '))A=n;//a的类型为int。
decl type(func 2())b=0;//b的类型是int。
decl type(func 3(10.5))c=0;//c的类型是int。
decltype(func4(1,2,3))x=n;//x的类型是const int。
decl type(func 5())y=0;//y的类型是const int。
在exp中调用函数时,需要括号和参数,但这只是一种形式,并不会真正执行函数代码。
3规则示例:
A级
公共:
int x;
}
int main()
{
const A obj
decl type(obj . x)a=0;//a的类型为int。
decl type((obj . x))b=a;//b的类型是int。
int n=0,m=0;
decl type(m n)c=0;//n m得到一个右值,c的类型是int
decl type(n=n m)d=c;//n=n m得到一个左值,d的类型是int。
返回0;
}
左:表达式执行后仍然存在的数据,即持久数据;右值是指表达式执行结束时不再存在的数据,即临时数据。一个简单的区分方法就是取表达式的地址。如果编译器没有报错,就是左值,否则就是右值。
3.实际应用
可以对类的静态成员使用auto,但不能对类的非静态成员使用auto。如果想推导出一个类的非静态成员的类型,只能用decltype。
例子如下:
模板类型名称T
A级
{
私人:
decl type(t . begin())m _ it;
//typename T:iterator m _ it;//这种用法会出错
公共:
void func(T容器)
{
m _ it=container . begin();
}
};
int main()
{
常数矢量v;
成本矢量对象;
obj . func(v);
返回0;
}
关于C decltype的使用,本文到此结束。有关C decltype的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。