在许多编程语言中,您用来指代对象的名称与对象本身不同。一个对象可能有多个名称。
在 C++ 中为一个对象分配多个名称的最直接方法是使用说明&
符声明一个名称。(此用法与&
运算符不同;说明符不是运算符。)
当您用 声明这些参数时&
,它们将成为作为参数传递给函数的对象的别名。此类名称称为引用。
C++ 有几种(好吧,很多)种类和类别的表达式。两个重要的概念是可修改性和所有权。当您传递对函数的引用时,您可以选择授予它修改对象的权限以及对象的所有权。可修改性由指定符的缺失表示const
,所有权由使用&&
而不是表示表示&
(这是 C++11 中的新功能)。
不允许函数获得对仅存在短暂存在的对象的可修改、非拥有访问权,因为它应该能够期望将结果写入这样的对象以返回给调用者。该值50
存储在这样的瞬态对象中。
一种解决方案是使用int const & advances
,但更好的解决方案是根本不使用引用,因为您并没有真正尝试使用别名来引用共享对象。
许多人在概念上假设引用是自动取消引用的const
指针。这工作得很好,编译器几乎总是以这种方式做事。但这不一定是真的。例如,给定这个类定义:
struct s {
static int x;
int &r = x;
char c;
};
编译器可以确定它r
始终引用全局x
,并替换每次使用r
with x
。无需在每个对象中存储引用,sizeof(s)
合法地可以是 1。
这比当前的 C++ 代码分析更先进,但它不可避免地会在某个时候出现。面向未来的代码不应期望引用的实现等同于指针。