前言
以前对decltype((i))的会把原本类型改掉,很奇怪,decltype(++i)和decltype(i++),decltype(“sdf”),这都啥啊,为啥会这样呢,除了背下来,感觉没啥办法。你也有这种感觉的话。那正好一起看看。
一、decltype规则
先贴规则。
- 如果是用户指定标识,就按照这个标识的类型推导。
- 如果不是用户标识,返回值是左值,则推导为左值引用。
- 如果不是用户标识,返回值是将亡值,则推导为右值引用。
- 以上都不是。返回原本类型。
二、规则详解
用户标识就是用户指定的变量名。 int i;
- decltype(i) n;
满足规则1。i是用户定义的名字。因此n的类型是int - decltype((i)) n;
满足规则2。i是用户定义的名字,(i)是个表达式,返回的是i,他不属于用户标识,但是i是个左值。因此n的类型是int& - decltype(++i) n;
同上,++i不是用户定义的名字,++i返回的是左值(int& operator++()),因此最后n的类型是int& n; - decltype(i++) n;
i++的返回值是右值(int operator++(int))。不满足用户标识,左值,将亡值。因此n的类型为int(这里可能有疑惑,右值什么鬼,我这里右值指的是纯右值,右值分为将亡和纯右值,将亡是显示调用std::move和&&的类型) - decltype(“abcd”) n;
"abcd"是字符常量区的字符,"abcd"类型是const char *,因此n的类型是const char *;
总结
我只是使用者,我没有必要搞清缘由,就像做数学题,我没必要了解定义是如何由来的。我能做到的仅仅是把公式,定义当作基石,在不理解,无法比喻的情况,看出我能看懂的部分。
|