“解引用”的返回类型为什么是“引用类型”?

115 天前
 huzhikuizainali

请看 C++ Primer 中的介绍。“如果表达式的内容是解引用,则 decltype 将得到引用类型。” 书中说的很明确。但是我不能理解。如果有:

int i = 42;

int * p;

p=&i;

那么 k= * p; //k 中存储整型的 42

解引用”释放“的数据是其指向的内存中所存储的数据,如果存储的是 int ,那么解引用后释放的就是 int 类型 。如果指针 p 目标内存中存储的是字符串,那么解引用后返回字符串。那么 decltype 捕获的应该是字符串类型。这样才比较”合理“。书中的意思很明确。但是我不理解。请问应该如何理解“如果表达式的内容是解引用,则 decltype 将得到引用类型。”

857 次点击
所在节点    C++
5 条回复
codehz
115 天前
因为 c++有引用的概念,所以可以用引用来表达返回左值的类型,而*p 作为表达式是左值表达式,decltype 对左值表达式使用时,返回引用用来区分其他值类别
exch4nge
115 天前
虽然我也没了解透彻,尝试强行回答下,参考 https://en.cppreference.com/w/cpp/language/decltype

*p 是一个表达式,符合第二种 decltype ( expression ) ,第二种分成下面三种情况

a) if the value category of expression is xvalue, then decltype yields T&&;
b) if the value category of expression is lvalue, then decltype yields T&;
c) if the value category of expression is prvalue, then decltype yields T.

然后 *p 属于 lvalue ,所以是引用。参考 https://en.cppreference.com/w/cpp/language/value_category
huzhikuizainali
115 天前
@exch4nge 感谢你提供的参考链接。基本上可以认为“就是这么规定的”是吧。如果是这样。那也就不需要进一步去“理解了”
按照他的第三条规定,那么 decltype(*p+1) 返回的就是 int 类型,对吧?
RollingTruck
115 天前
似乎 decltype 的返回值, 根据参数不同, 有两种含义,
第一种含义是值的类型, 这也是符合直觉的含义,
第二种含义是判断 lvalue, rvalue, xvalue,
也许拆分成 2 个函数更好?
cybort
115 天前
在没有明确指示的情况下,优先使用引用方式而非传值,这样性能较好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1008731

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX