为什么不能分配引用的目标对象?

时间:2013-12-15 21:58:32

标签: c++ reference language-features

如果我理解正确,引用的动机是使“通过引用”工作变得更容易和更清洁,而不必费心使用指针解除引用。但它们本质上是恒定的,它们只能指向单个对象,即使有效地引用是指针并且在技术上可以重新分配。如果引用可以为null,例如,这也是有益的。在使用之前检查返回的引用是否有效,但这不是一个功能。

忽略这些功能并呈现功能背后的特殊动机是什么?

4 个答案:

答案 0 :(得分:5)

动机分为两部分:

1)引用在概念上是对象的别名,因此它的行为(尽可能多且有用)就像变量名一样。只要它在范围内,它就引用同一个对象,它总是引用一个对象。所以,不能重新坐下而不是空。

2)为了将参数传递给重载运算符,发明了引用。没有特别需要重新定位这些参数,并且它们当然必须始终引用一个对象,因为运算符总是有操作数(或者只有一个操作数用于一元运算符)。适合需要的功能是操作数的别名,这就是为什么引用被设想为别名。

以这种方式构思,他们有其他用途。这些用途中的任何一个都不会从它们可重新占位或无效中受益,以便将概念从对象名称改变。最接近的可能是它们在类中用作非静态数据成员。在这种情况下,它们会干扰诸如复制分配之类的事情,但是再次不清楚参考数据成员在复制分配时应该“应该”如何表现,因此没有明确的方法来处理它。指针将处理引用不能的情况。

答案 1 :(得分:3)

  1. 如果要引用多个对象,则只需要不同的引用类型。
  2. 如果您希望能够更改引用本身(而不仅仅是引用它),您需要一个指针。同上参考可能不引用任何东西(即为空)。
  3. 这就是动机:专注于通过其他方式无法完成的事情。

答案 2 :(得分:0)

不可空的引用是一件好事,它可以让你对函数的输入做出更有力的保证,等等。它允许您传递对象而无需进行空指针测试。

如果你想要一个可变引用,可以使用指针或std::reference_wrapper。如果您想要一个可选的返回值,那么您可以使用boost::optional

之类的内容

答案 3 :(得分:0)

我会说有关于引用可以做什么的限制,因为它允许:

  • 编译器严格检查引用的有效使用,在大多数情况下使用引用时提供编译时安全性
  • 使用常规指针仍然可以完成更复杂的操作

所以指针是指知道你想要用它们做些棘手的事情。参考文献的典型案例是“我只是想把一块数据交给你”,而不必担心做得对。