我一直对C++中的引用感到困惑,所以我做了一个小实验,使用了以下函数
std::vector<float> & fun(std::vector<float> & x) {
return x;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下两种方式调用该函数:
std::vector<float> x(10000);
std::vector<float> result1 = fun(x);
std::vector<float> & result2 = fun(x);
Run Code Online (Sandbox Code Playgroud)
现在变量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;
Run Code Online (Sandbox Code Playgroud)
换言之,result1成为复制的x,而result2变成一个参考到x.这意味着result1不同于x,同时result2并x引用相同的基础数据.
它真的没有什么不同:
int a = 42;
int b = a;
int &c = a;
Run Code Online (Sandbox Code Playgroud)
此时,b是一个独立的副本,如果更改,将不会影响其他两个变量.但是,由于a并且c引用相同的基础数据,因此更改一个将影响另一个.
这基本上是一样的
std::vector<float> x(10000);
std::vector<float> & result2 = x;
std::vector<float> result1 = result2;
Run Code Online (Sandbox Code Playgroud)
语言允许这样做,因为result2是 的引用x,每次提及 都result2与 相同x。您可以看到引用是一个别名,result2是的别名x。
| 归档时间: |
|
| 查看次数: |
498 次 |
| 最近记录: |