C++笔记(三)~decltype

举报
海轰Pro 发表于 2022/08/26 16:34:34 2022/08/26
【摘要】 decltype基础作用选择并返回操作数的数据类型(编译器分析表达式并得到它的类型,却不实际计算表达式的值)示例#include<iostream>#include <typeinfo>using namespace std;int f(){ return 0;}int main(){ // 通过decltype 返回 f()的类型 int // 下面一句代码与 int sum...

decltype基础

作用

选择并返回操作数的数据类型(编译器分析表达式并得到它的类型,却不实际计算表达式的值)

示例

#include<iostream>
#include <typeinfo>
using namespace std;
int f(){
    return 0;
}
int main(){
		// 通过decltype 返回 f()的类型 int
    // 下面一句代码与 int sum=2 等价
    decltype(f()) sum=2;
    cout<<"sum="<<sum<<endl;
    cout<<"sum的类型是:"<<typeid(sum).name()<<endl;// i:整型
}

运行结果

decltype需要注意的地方

1.decltype处理顶层const、引用与auto不同

示例代码

#include<iostream>
using namespace std;
int main(){
    const int ci=0;
    const int &cj=ci;
    decltype(ci) x=0;// x的类型是 const int
    decltype(cj) y=x;// y的类型是 const int& ,引用,y是绑定到了x
  //decltype(cj) z; // 错误:引用必须初始化
}

2.如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。

测试代码

#include<iostream>
#include<typeinfo>
using namespace std;
int main(){
    int a=1;
    // a是int a+2.0结果是double类型 所以decltye选择并返回的就是double类型
    decltype(a+2.0) b;
    cout<<"b的类型是:"<<typeid(b).name()<<endl;// d:double类型
}

运行结果

3.如果表达式的内容是解引用操作,则decltype会得到引用类型

测试代码

#include<iostream>
using namespace std;
int main(){
    int a=1;
    int *p=&a;
    int temp=3;
    decltype(*p) c=temp;// 相当于 int &c=temp 此时c的类型是int& 引用!
    cout<<"c="<<c;//c=3
}

测试结果

4.对于decltype所用的表达式来说,如果变量名加上了一对或多对括号,那么得到的类型与不加括号时会有不同。

测试代码

#include<iostream>
using namespace std;
int main(){
    int a=1;
    decltype(a) b;// 相当于 int b
    decltype((a)) c=a;// 相当于 int &c=a 是引用
    // 注意:当是decltype((variable)) 得到的结果永远是 引用!
}

预处理变量

两种状态

  • 已定义
  • 未定义


#define:把一个名字设定为预处理变量

#ifdef:当且仅当变量已定义时为真

#ifndef:当且仅当变量未定义为真


示例代码

#ifndef TEST_H
#define TEST_H
#include<iostream>
.
.
.
#endif

// 大概意思是:
// 首先判断TEST_H是否被定义 如果没有 则#ifndef判断未真 继续执行后面当操作,直到遇到#endif
// 如果TEST_H已经被定义了 则会忽略#ifndef、#endif之间当所有代码

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。