函数返回int&

这个问题在这里已经有了答案:

  • 传递引用与价值传递之间有什么区别? 18个答案

  • int& foo()是一个函数,它返回一个整数的(左值)引用。

    引用就像一个指针,但不同于指针,它没有自己的身份。 它是目标的别名,而不是逻辑上的目标地址。

    通常引用是作为指针来实现的,但引用的意义在于编译器经常可以完全删除它们的存在。 用指针来做这件事通常比较困难,因为他们的身份与他们所指的不同。

    C ++没有办法获得引用的地址。 你可以得到一个包含引用的结构的地址,这个引用是如此接近以至于没有什么区别,但是你不能得到引用本身的地址。

    int& foo()返回一个整数的引用。 举个例子:

    int x=0, y=0;
    bool pick_x=true;
    int& foo() { if (pick_x) return x; else return y; }
    

    现在foo根据pick_x的状态返回对xy任一个的引用。

    您可以使用的返回值foo几乎完全一样,如果它是x (或y如果!pick_x 。)

    左值和右值来自C的日子。左值是可以在=符号的左侧或右侧出现的表达式,并且右值是只能在=符号的右侧出现的表达式。

    在许多语言中,左值和右值可以用语法表示。 在C ++中,引用的存在意味着表达式的返回值可以是一个有效的事物,重载operator=的存在意味着有时可以赋值rvalues。 所以事情变得棘手。

    在C ++ 11中,添加了左值引用和右值引用。 每个拒绝绑定到其他类型的表达式。 还有转发引用,主要发生在模板类型推演中。


    非const左值引用的语义与普通指针的语义完全相同,期望指针需要*运算符来解引用它,而引用不需要。

    所以你的

    int& foo();
    foo() = 42;
    

    可以用指针的形式重新表达

    int* foo();
    *foo() = 42;
    

    如果你在第二段代码中没有看到任何奇怪或不寻常的东西,那么在第一段代码中你不应该看到任何奇怪或不寻常的东西。

    例如

    int i;
    
    int &foo() { return i; }
    int *bar() { return &i; }
    
    int main()
    {
      foo() = 42;
      assert(i == 42);
    
      *bar() = 24;
      assert(i == 24);
    }
    
    链接地址: http://www.djcxy.com/p/20601.html

    上一篇: Function returning int&

    下一篇: What is the difference between * and *& in C++?