我正试图更好地理解"通过引用传递"的内容。在c++中确实如此。在以下代码中:
#include <iostream>
void func(int& refVar) {
std::cout << refVar;
}
int main() {
int val = 3;
func(val);
}
当func
被调用时,func
的引用如何改变val
的行为?val
变量是否隐式转换为"引用"?类型,然后传递到函数,就像如何val
将转换为float
,如果func
在float
而不是int
?还是其他原因?
同样,在下面的代码中:
int val = 3;
int& ref = val;
val
的引用如何赋值给ref
?是否存在隐式类型转换,也可以通过函数手动实现,或者编译器是否在不转换的情况下意识到ref
是一个引用,并且需要存储val
的地址?
你为什么不试试呢?
https://godbolt.org/z/8or3qfd5G
请注意,编译器可以进行隐式转换并传递对临时对象的引用。
但是请求引用的唯一(好的)理由是存储引用以供以后使用或修改值。前者将产生一个悬空引用,后者将修改一个值,该值将在函数返回时被删除,并且永远无法访问。所以这个结构实际上很糟糕。
c++的神因此决定不允许你使用这个。隐式转换产生右值,并且只能将const引用绑定到右值。
将右值绑定到const引用仍然是危险的。不应该存储const引用以供以后使用,因为它可能成为悬空。
更新:我注意到我从来没有解释过如何调用一个带引用的函数或给引用赋值。这两者基本上是一样的。
引用只是给某物一个(另一个)名字。不需要改变类型,也不需要强制转换。所以当你有
`func(val)`
则在函数持续时间内,val
中的值具有第二个名称refVar
。与int & refVal = val;
相同。现在val中的值有了第二个名字refVal
。
我想它们完全可以互换。
注意:在函数调用中,它是如何工作的是实现细节,但大多数编译器在底层传递一个int *
给函数。