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]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • MySQL的四种事务隔离级别

    MySQL的四种事务隔离级别

  • Django(15)外键和表关系[通俗易懂]

    Django(15)外键和表关系[通俗易懂]外键删除操作如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下:CASCADE:级联操作。如果外键对应的那条数据被删除了,

  • Linux命令之tail – 输出文件尾部/动态监视文件尾部

    Linux命令之tail – 输出文件尾部/动态监视文件尾部本文链接:http://codingstandards.iteye.com/blog/832575  (转载请注明链接)用途说明tail命令可以输出文件的尾部内容,默认情况下它显示文件的最后十行。它常用来动态监视文件的尾部内容的增长情况,比如用来监视日志文件的变化。与tail命令对应的是head命令,用来显示文件头部内容。 常用参数格式:tailfile

  • matlab如何做正交多项式曲线拟合,matlab正交多项式拟合

    matlab如何做正交多项式曲线拟合,matlab正交多项式拟合在实验模态分析中用Matlab实现离散化正交多项式算法[C],马永列;陈章位;胡海清4.在实验模态分析中用Matlab实现离散化正交多项式算法[C],马永列……变换后的条件数上限表如下:拟合次数1=1cond2(A)2<9.93<50.34<435④在实际应用中还可以利用正交多项式求拟合多项式。一种方法是构造离散……..

  • 在线难例挖掘(OHEM)[通俗易懂]

    在线难例挖掘(OHEM)[通俗易懂]OHEM(onlinehardexampleminiing)详细解读一下OHEM的实现代码:defohem_loss(batch_size,cls_pred,cls_target,loc_pred,loc_target,smooth_l1_sigma=1.0):”””Arguments:batch_size(int):…

  • Class类 和 class对象(运行时的类型信息)

    Class类 和 class对象(运行时的类型信息)什么是类?可以理解为。class文件某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-TimeTypeIdentification),多态是基于RTTI实现的每一个类都有一个Class对…

发表回复

您的电子邮箱地址不会被公开。

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