decltype推导规则

decltype推导规则

当用decltype(e)来获取类型时,编译器将依序判断以下四规则:

1.如果e是一个没有带括号的标记符表达式(id-expression)或者类成员访问表达式,那么decltype(e)就是e所命名的实体的类型。此外,如果e是一个被重载的函数,则会导致编译时错误。
2.否则,假设e的类型是T,如果e是一个将亡值(xvalue),那么decltype(e)为T&&。
3.否则,假设e的类型是T,如果e是一个左值,则decltype(e)为T&。
4.否则,假设e的类型是T,则decltype(e)为T。

标记表达式:基本上,所有出去关键字、字面量等编译器需要使用的标记之外的程序员自定义的标记(token)都可以是标记符(identifier)。而单个标记符对应的表达式就是标记符表达式。比如:int arr[4];
则arr是一个标记符表达式,而arr[3]+0、arr[2]等,则都不是标记符表达式。
通过代码理解:

int arr[5] = {0};
int* ptr = arr;
struct S {double d;} s;
void Overload(int);
void Overload(char);	//重载函数
int&& RvalRef();
const bool Func(int);
int i = 0;

//规则1:单个标记符表达式以及访问类成员,推导为本类型
decltype(arr) var1; // int[5],标记符表达式
decltype(ptr) var2; // int*,标记符表达式
decltype(s.d) var3; // double,成员访问表达式
decltype(Overload) var4; // 重载函数无法通过编译

//规则2:将亡值推导为类型的右值引用
decltype(RvalRef()) var5 = 1; //int&&

//规则3:左值推导为类型的引用
decltype(true ? i : i) var6 = i; //int&,三元运算符,返回一个i的左值
decltype((i)) var7 = i; //int&,带圆括号的左值
decltype(++i) var8 = i; //int&,++i返回i,i是左值
decltype(arr[3]) var9 = i; //int&, []操作符返回左值
decltype(*ptr) var10 = i; //int&,*解引用操作符返回左值
decltype("lval") var11 = "abc"; //const char(&)[] 类型是字符型常量数组的引用,字符串字面常量为左值

//规则4:以上都不是,推导为本类型
decltype(1) var12; //int,除字符串外的字面量为纯右值
decltype(i++) var13; //int,后置自增符返回的是i的临时复制变量,是纯右值
decltype((Func(i))); //const int,括号可以忽略

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值