C++decltype,c++ auto decltype,C++ decltype用法举例说明

C++decltype,c++ auto decltype,C++ decltype用法举例说明

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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: