代码之家  ›  专栏  ›  技术社区  ›  Avi

C中通过ref实现整数字面值的内存地址++

  •  3
  • Avi  · 技术社区  · 11 月前
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
       // Case 1
       cout << &5; // This line fails to compile. Ok, I get this because "5" is a rvalue.
       
       // Case 2
       const int& ref = 5;
       cout << &ref; // Works fine. Why?
    
       // Case 3
       cout << &"SomeString"; // Works  fine. Ok, I get this because "SomeString" is a lvalue
        
       return 0;
    }
    

    为什么案例1失败,案例2通过? 我在别处找不到具体的解释。大多数答案都令人困惑且自相矛盾。

    我理解整数文字中的“5”,它是一个右值(我们不能取它的地址) 那么,在情况2中,const左值ref做了什么特殊的事情,它允许取地址“5”呢?正如我所读到的,引用(无论是左值还是右值)只是一个别名。它没有自己的地址。

    1 回复  |  直到 11 月前
        1
  •  7
  •   Ahmed AEK    11 月前

    非const左值引用不能绑定到临时值或文字,也不能获取文字或临时值的地址。

    当const左值引用绑定到临时或文字时,它基本上具有生存期扩展

    const int& ref = 5; // literal
    

    编译器将其解释为

    const int foo = 5;
    const int& ref = foo;
    

    您将返回编译器延长了其生存期的对象的地址。 foo

    请注意,生命周期延长并不总是适用,请参阅 Why doesn't a const reference extend the life of a temporary object passed via a function? ,对于何时适用寿命延长有一些规则。(你需要rhs是临时的或字面的,而不是对它的引用,也不是右值引用)


    字符串文字不同,请参见 C++ reference of a string literal ,它类似于生命周期扩展,你可以获取它们的地址,它们无论如何都存储在静态内存中,它们不是临时的,它们存在于函数的范围之外。

    推荐文章