我试图或多或少地交换两个引用变量(作为实践,我可以交换实际变量)。我尝试通过创建一个临时变量并使其中一个引用与另一个相等来做到这一点,但这被编译器击落了。这是一个例子:
void Foo()
{
//code
int& ref1 = a;
int& ref2 = b;
int temp;
temp = ref1;
ref1 = ref2;
ref2 = temp;
//or, better yet
std::swap(ref1, ref2);
}
我收到了一个错误,并查看了faq lite。它详细说明了它们无法重新安装,但没有解释原因。为什么呢?
Here是Faq Lite的链接供参考(< ---,得到它?)。
答案 0 :(得分:10)
因为没有语法可以做到:
int x = 0;
int y = 1;
int & r = x;
现在,如果我说:
r = y;
我将y的值赋给x。如果我想重新安装,我需要一些特殊的语法:
r @= y; // maybe?
由于使用引用的主要原因是函数的参数和返回类型,这不是问题,C ++的设计者似乎认为这是一条值得关注的路径。
答案 1 :(得分:7)
引用是对象的别名 别名不能改变(我们不是间谍; - )
答案 2 :(得分:3)
因为引用没有自己的地址(如果它们是依赖于实现的,并且您无法直接使用&运算符访问它们。)
& operator用于获取引用引用的东西的地址。
指针确实有自己的地址,你可以使用&运营商。
int x = 4;
int *p = &x;
//p holds the address of x
//&p holds the address of p.
int &r = x;
//&r holds the address of x
如果某些东西没有自己的地址,那么就无法在其中存储值。如果它无法在其中存储值,则无法更改。
我认为parashift C++ FAQ on references说得最好:
重要提示:即使a 参考通常使用 底层程序集中的地址 语言,请不要想到 引用作为一个有趣的指针 到一个对象。参考是 宾语。它不是指针 对象,也不是对象的副本。它 是对象。
再次在FAQ 8.5中:
与指针不同,一旦引用就是 绑定到一个对象,它不可能 “重新安置”到另一个对象。该 引用本身不是一个对象(它 没有身份;以地址为 引用为您提供地址 指称;记住:参考 是它的指示物。)
答案 3 :(得分:1)
再次查看您的代码:
temp = ref1;
ref2 = temp;
ref1 = ref2;
引用是别名。您对引用执行的所有操作都在它引用的对象上执行。在上面的代码中,编译器应该如何神奇地知道您没有尝试将值分配给引用的变量,而是试图更改引用本身?没有语法来指出它之间的区别,例如:
ref1 = 3;
您通常希望将值3分配给ref1
引用的对象。
简而言之,这只是设计。如果你想要“可重复”的引用,那么你只需要使用指针(或者,如果你想避免使用指针算术,boost::optional
)。
答案 4 :(得分:1)
与指针不同,引用旨在保证它们始终引用对象。为了满足这个gaurantee,编译器要求在声明中初始化所有引用,并禁止您重新分配它们。
与指针类似,引用变量允许您通过多个位置访问对象的同一实例 - 但与指针不同,引用提供更高级别的安全性。