decltype有什么用_剑本身用法的介绍

decltype有什么用_剑本身用法的介绍想从表达式推断出要定义的变量的类型,但不想计算表达式的值,此时可以使用decltype

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

想从表达式推断出要定义的变量的类型,但不想计算表达式的值,此时可以使用decltype
语法是:delctype(表达式),其中表达式可以是变量、函数、数组等。

#include <typeinfo>
#include <iostream>

namespace test_decltype { 
   
	double onlyDeclartionFunc();

    auto main() -> int { 
   
		std::cout << "testing decltype..." << std::endl;
		
		/* 表达式是函数 */
		decltype(onlyDeclartionFunc()) sum = 34;   // 使用decltype根据函数类型推断类型时可以仅要求函数有声明,不要求函数有定义
		std::cout << "type(sum) is: " << typeid(sum).name() << std::endl;  // double
		
		/***************************************************************************/

		float i = 3.4f;
		decltype(i) a = 52;
		std::cout << "type(a) is: " << typeid(a).name() << std::endl;     // float
		
		// 使用decltype时会返回变量的真实类型(包括const和引用),这与auto有区别
		const int ci = 0;        // const int
		const int &cj = ci;      // const int &
		decltype(ci) b = 9;      // const int
		// b = 10; // error C3892: “b”: 不能给常量赋值
		decltype(cj) c = b;      // const int &
		// c = ci; // error C3892: “c”: 不能给常量赋值
		decltype(cj) d = 9;     // const int &
		// decltype(cj) e; // error C2530: “e”: 必须初始化引用
		std::cout << "type(ci) is: " << typeid(ci).name() << std::endl;  // const int(ps:编译器输出时不会带const,下同)
		std::cout << "type(cj) is: " << typeid(cj).name() << std::endl;  // const int &
		std::cout << "type(b) is: " << typeid(b).name() << std::endl;    // const int
		std::cout << "type(c) is: " << typeid(c).name() << std::endl;    // const int &
		std::cout << "type(d) is: " << typeid(d).name() << std::endl;    // const int &
		
		/***************************************************************************/
		
		// decltype(表达式)推断出引用类型的几种情况:
		// 1. 表达式本身是引用;
		// 2. 表达式是指针的解引用;
		// 3. 表达式加括号;
		int j = 0;
		int &k = j;
		int *p = &j;
		
		std::cout << "Original j, 0 == " << j << std::endl;
		
		decltype(k) f = k;     // f是j的引用(表达式本身是引用)
		f = 1;
		std::cout << "f is j's reference, 1 == " << j << std::endl;
		
		decltype(*p) g = j;    // g是j的引用(表达式是指针的解引用)
		g = 2;
		std::cout << "g is j's reference, 2 == " << j << std::endl;
		
		decltype((j)) h = j;   // h是j的引用(表达式加括号)
		h = 3;
		std::cout << "h is j's reference, 3 == " << j << std::endl;
		
		decltype(k+0) m = k;   // m是int,不是int&,因为k+0是int类型
		m = 4;
		std::cout << "m is not j's reference, 4 != " << j << std::endl;
        
        // 对数组使用decltype**得到的是数组类型
        int arr[] = { 
   3,4,5};
        // decltype(arr) crr = {5,6,7,8,9}; // error: too many initializers for 'int [3]'
        decltype(arr) drr = { 
   5,6,7};           // 注意,数组元素的个数是数组类型的一部分
        std::cout << "type(drr) is: " << typeid(drr).name() << std::endl;   // int [3]
		
		/***************************************************************************/
		
		std::cout << "------------------------------" << std::endl;
        return 0;
    }
}

以上程序的输出:

testing decltype...
type(sum) is: double
type(a) is: float
type(ci) is: int
type(cj) is: int
type(b) is: int
type(c) is: int
type(d) is: int
Original j, 0 == 0
f is j's reference, 1 == 1 g is j's reference, 2 == 2
h is j's reference, 3 == 3 m is not j's reference, 4 != 3
type(drr) is: int [3]

对数组使用decltype得到的是数组类型与auto不同

// 对数组使用decltype
int arr[] = { 
   3,4,5};
       
// decltype(arr) crr = {5,6,7,8,9}; // error: too many initializers for 'int [3]'
decltype(arr) drr = { 
   5,6,7};           // 注意,数组元素的个数是数组类型的一部分
std::cout << "type(drr) is: " << typeid(drr).name() << std::endl;   // int [3]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195474.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 博科Brocade 300光纤交换机配置zone教程

    博科Brocade 300光纤交换机配置zone教程博科Brocade300光纤交换机配置zone教程光纤交换机作为SAN网络的重要组成部分,在日常应用中非常普遍,本次将以常用的博科交换机介绍基本的配置方法。博科300实物图:环境描述:如上图,四台服务器通过各自的双HBA卡连接至两台博科300光纤交换机,IBMV3700为双控制器,每个控制器再分别与两台光纤交换机相连。完成所有的连线及配置工作后,还需对光纤交…

    2022年5月21日
    42
  • vue中 关于$emit的用法

    vue中 关于$emit的用法1、父组件可以使用props把数据传给子组件。2、子组件可以使用$emit触发父组件的自定义事件。vm.$emit(event,arg)//触发当前实例上的事件vm.$on(event,fn);//监听event事件后运行fn;例如:子组件:<template><divclass=”train-city”>&l………

    2022年6月25日
    44
  • “大数据管理局”让大数据共用共享

    “大数据管理局”让大数据共用共享近日,广州市政府官方网站公布了工信委、商务委和国资委3个部门的“三定方案”。三个部门共“定编”339名,其中商务委编制最多,占比超4成。机构设置方面,工信委下设的广州市大数据管理局(正处级)颇具创新,其承载着建设工业大数据库等9项重要职责。城市发展到了今天这么大的体量,社会治理模式也需要不断升级。大数据,无疑是一个重要的发展方向。随着网络的普及…

    2022年6月8日
    46
  • Java并发篇:volatile关键字吐血整理「建议收藏」

    Java并发篇:volatile关键字吐血整理「建议收藏」1.1主内存与工作内存在上一篇文章中我们已经知道线程是通过主内存去进行线程间的隐式通信的,而线程对共享变量的写操作在工作内存中完成,由JMM控制共享变量由工作内存写回到主内存的时机。JMM提供了一个保证内存可见性的原则:happens-before原则。这个原则可以保证线程对共享变量的写操作对其它线程可见。如果在多线程环境下需要满足happens-before原则,就…

    2022年7月7日
    31
  • php 扫描url死链接 \033[31m ANSI Linux终端输出带颜色

    php 扫描url死链接 \033[31m ANSI Linux终端输出带颜色

    2021年11月3日
    45
  • SpringCloud与Dubbo的比较

    SpringCloud与Dubbo的比较Dubbo一、dubbo简介Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。现已发展成为Apache的顶级孵化开源项目,详见官网:…

    2022年6月14日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号