V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huzhikuizainali
V2EX  ›  C++

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

  •  
  •   huzhikuizainali · 343 天前 · 1136 次点击
    这是一个创建于 343 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    int i = 42;

    int * p;

    p=&i;

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

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

    pFidMAx.png

    codehz
        1
    codehz  
       343 天前
    因为 c++有引用的概念,所以可以用引用来表达返回左值的类型,而*p 作为表达式是左值表达式,decltype 对左值表达式使用时,返回引用用来区分其他值类别
    exch4nge
        2
    exch4nge  
       343 天前
    虽然我也没了解透彻,尝试强行回答下,参考 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
        3
    huzhikuizainali  
    OP
       343 天前
    @exch4nge 感谢你提供的参考链接。基本上可以认为“就是这么规定的”是吧。如果是这样。那也就不需要进一步去“理解了”
    按照他的第三条规定,那么 decltype(*p+1) 返回的就是 int 类型,对吧?
    RollingTruck
        4
    RollingTruck  
       343 天前
    似乎 decltype 的返回值, 根据参数不同, 有两种含义,
    第一种含义是值的类型, 这也是符合直觉的含义,
    第二种含义是判断 lvalue, rvalue, xvalue,
    也许拆分成 2 个函数更好?
    cybort
        5
    cybort  
       343 天前 via Android
    在没有明确指示的情况下,优先使用引用方式而非传值,这样性能较好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5612 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:25 · PVG 11:25 · LAX 19:25 · JFK 22:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.