混淆C++从函数返回引用

Confusion on C++ return reference from function

本文关键字:返回 引用 函数 C++ 混淆      更新时间:2023-10-16

我一直对C++中的引用感到困惑,所以我对以下函数做了一些实验

std::vector<float> & fun(std::vector<float> & x) {
return x;
}

然后,我使用以下两种方式调用该函数:

std::vector<float> x(10000);
std::vector<float> result1 = fun(x);
std::vector<float> & result2 = fun(x);

现在变量 result2 确实是 x 的引用,但 result1 似乎是 x 的副本而不是引用。所以在这里我很困惑:

为什么我可以将非引用变量声明为返回引用的函数的返回值?

C++是否会因为我的 result1 声明不是引用而将返回的引用更改为非引用变量?

由于fun(x)只是接受对x的引用并返回它,因此您的代码(左侧)等效于右侧的代码:

a std::vector<float> x(10000);          a std::vector<float> x(10000);
std::vector<float> result1 = fun(x);    std::vector<float> result1 = x;
std::vector<float> &result2 = fun(x);   std::vector<float> &result2 = x;

换句话说,result1成为x的副本,而result2成为对x引用。这意味着result1不同于x,而result2x引用相同的底层数据。

这真的没有什么不同:

int a = 42;
int b = a;
int &c = a;

此时,b是一个独立的副本,如果更改,不会影响其他两个变量。但是,由于ac引用相同的基础数据,因此更改一个会影响另一个。

这基本上与

std::vector<float> x(10000);
std::vector<float> & result2 = x;
std::vector<float> result1 = result2;

语言允许,因为result2x的引用,每次提到result2都与x相同。您可以将引用视为别名result2x别名

没有发生真正的变化

发生的情况是引用引用某物,当您在表达式中使用引用时,您(通常)会得到它所引用的内容。所以,如果我有这样的东西:

int x = 1;
int &rx = x;
std::cout << rx;

打印出来的是x的值 - 引用被取消引用以获取值,这就是打印出来的。同样,如果我有这样的东西:

int x = 1;
int y = 2;
int rx = x;
int ry = y;
int z = rx + ry;

。编译器将取消引用rxry以获取xy的值。然后,它将这些加在一起,并将结果分配给z

总结

引用是某个对象的别名。在大多数情况下(实质上是初始化另一个引用以外的任何内容),在表达式中使用引用使用引用的对象,而不是引用本身。