混淆C++从函数返回引用
Confusion on C++ return reference from function
我一直对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
,而result2
和x
引用相同的底层数据。
这真的没有什么不同:
int a = 42;
int b = a;
int &c = a;
此时,b
是一个独立的副本,如果更改,不会影响其他两个变量。但是,由于a
和c
引用相同的基础数据,因此更改一个会影响另一个。
这基本上与
std::vector<float> x(10000);
std::vector<float> & result2 = x;
std::vector<float> result1 = result2;
语言允许,因为result2
是x
的引用,每次提到result2
都与x
相同。您可以将引用视为别名,result2
是x
的别名。
没有发生真正的变化。
发生的情况是引用引用某物,当您在表达式中使用引用时,您(通常)会得到它所引用的内容。所以,如果我有这样的东西:
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;
。编译器将取消引用rx
并ry
以获取x
和y
的值。然后,它将这些加在一起,并将结果分配给z
。
总结
引用是某个对象的别名。在大多数情况下(实质上是初始化另一个引用以外的任何内容),在表达式中使用引用使用引用的对象,而不是引用本身。
相关文章:
- 寿命延长从函数返回引用
- 了解C++如何返回引用并绑定到引用
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 从类返回引用向量
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 混淆C++从函数返回引用
- 两个相同的重载运算符[]一个返回引用
- 为什么向量的.at()成员函数返回引用而不是迭代器
- C++使用和返回引用
- 返回 T 引用的 Const 函子禁止赋值
- 返回引用是否也会延长其生存期?
- 如何返回引用,然后递增迭代器
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 我是否需要将 ref 与 make_pair 一起使用才能返回引用?
- 在 vector::at 返回引用后进行更改
- 为什么PyImport_ImportModule返回引用计数为 3 而不是 1 的 PyObject*
- 超出返回引用的单一实例生存期
- Boost.Python 返回引用现有 c++ 对象的 python 对象
- C++ 运算符 += 重载返回引用
- 如何声明接受转发引用并返回引用或副本的函数模板