0
点赞
收藏
分享

微信扫一扫

decltype规则(如果你对decltype(i++/++i/(i)/“abcd“)这些感兴趣,那来看看)

jjt二向箔 2022-03-30 阅读 75

文章目录


前言

以前对decltype((i))的会把原本类型改掉,很奇怪,decltype(++i)和decltype(i++),decltype(“sdf”),这都啥啊,为啥会这样呢,除了背下来,感觉没啥办法。你也有这种感觉的话。那正好一起看看。我们聊聊看我分析的对不对。


一、decltype规则

先贴规则。

  1. 如果是用户指定标识,就按照这个标识的类型推导。
  2. 如果不是用户标识,返回值是左值,则推导为左值引用。
  3. 如果不是用户标识,返回值是将亡值,则推导为右值引用。
  4. 以上都不是。返回原本类型。

二、规则详解

用户标识就是用户指定的变量名。
int i;

  1. decltype(i) n;
    满足规则1。i是用户定义的名字。因此n的类型是int
  2. decltype((i)) n;
    满足规则2。i是用户定义的名字,(i)是个表达式,返回的是i,他不属于用户标识,但是i是个左值。因此n的类型是int&
  3. decltype(++i) n;
    同上,++i不是用户定义的名字,++i返回的是左值(int& operator++()),因此最后n的类型是int& n;
  4. decltype(i++) n;
    i++的返回值是右值(int operator++(int))。不满足用户标识,左值,将亡值。因此n的类型为int(这里可能有疑惑,右值什么鬼,我这里右值指的是纯右值,右值分为将亡和纯右值,将亡是显示调用std::move和&&的类型)
  5. decltype(“abcd”) n;
    "abcd"是字符常量区的字符,"abcd"类型是const char *,因此n的类型是const char *;

总结

我只是使用者,我没有必要搞清缘由,就像做数学题,我没必要了解定义是如何由来的。我能做到的仅仅是把公式,定义当作基石,在不理解,无法比喻的情况,看出我能看懂的部分。

举报

相关推荐

0 条评论