为什么选择&符号作为C ++中引用的符号?

有没有人知道为什么选择&符号作为表示C ++引用的方式?

AFAIK(虽然我没有附近的书),Stroustroup没有解释这个选择,我觉得有点奇怪,因为相同的符号已用于C中的地址。

Stroustrup总是非常不愿意引入新的保留符号或名称,因此他可能会使用它来避免使该function对C的用户看起来很奇怪。

除了我一般同意的Earwicker的回应。 我还推测,因为&是“地址”运算符,它有点合适。 由于引用在很多方面就像是通过地址而不是通过传递。

除此之外,获取变量的地址通常被称为“引用”

(是的,我知道引用不必使用引擎下的指针来实现,我指的是它们在概念上的工作方式)。

这只是猜测。

谁知道为什么Stroustrup会做任何事情,但我的猜测是因为参考参数的实现涉及传递左值的地址,Stroustrup选择了C address-of运算符,因为它可以让C程序员对成本模型有正确的认识。

这是我的理论。 我认为它与运算符对符号有效(语法)有很大关系。 考虑

int a[1]; // a[1] is valid (syntactically) int *a; // *a is valid int a(char, bool); // a(, ) is valid (function call) int C::*a; // .*a is valid 

从概念上讲,在那些声明中,使用类型( Ccharbool )命名的内容稍后将替换为该类型的表达式。 当然,目的是尽可能多地重用现有语言。 所以我认为他用&

 int &a; // &a is valid 

重要的一点是& 对引用表示的表达式有效:对于lvalues 。 引用是左值(命名变量也是),仅适用于它们并且可以应用:

 int &g(); // &g() is valid (taking the address of the referred to integer) int g(); // &g() is *not* valid (can't apply to temporary int) 

我的想法是指针中使用了2个符号:*和&。 因为int *表示指向int的指针,可能Stroustrup不想引入一个全新的符号。 由于引用有点像指针,他坚持使用&。 另外,之前唯一有效的使用是取得某些东西的地址,因此可以在声明中使用。