return cpp 函数中的引用 returns 一个副本

return reference in cpp function returns a copy

我正在尝试 return 函数 test 中参数的引用,但是当我将另一个值分配给 returned 引用时,原始值没有改变:

#include <iostream>

using namespace std;

int& test(int& n) {
    return n;
}

int main() {
    int n = 1;
    int m = test(n);
    m = 2;
    cout << n << endl; // n = 1
    return 0;
}

我怎样才能return这个引用如我所料?

本次测试仅供学习使用。

使 m 成为左值引用:

 int& m = test(n);

您也可以像这样绑定到临时对象:

int test(int& n) { // return by value
    return n;
}

int main() {
    int n = 1;
    int&& m = test(n); // rvalue reference binding to a copy of `n`
    m = 2;
    std::cout << n << std::endl;
    return 0;
}

虽然不推荐上面的代码。

甚至这样:

int&& test( int& n ) // return by rvalue reference
{
    return std::move( n ); // cast `n` from lvalue to xvalue
}

int main( )
{
    int n = 1;
    int&& m = test(n);
    m = 2;
    std::cout << n << std::endl;
}

这个也不推荐。您应该按值 return 而不是右值引用。

int m = test(n);

创建值 test(n) returns 的副本(在本例中为 n 的副本)。

如果您想要引用 test(n) 的 return 值,您必须使用一个:

int& m = test(n);

使用 auto 进行类型推断时会出现一个常见的警告:即使在这种情况下,您也必须使用

auto& m = test(n);