【问题标题】:C++: why can't we have references to references or array of references?C++:为什么我们不能引用引用或引用数组?
【发布时间】:2010-02-23 20:46:15
【问题描述】:

我注意到没有对引用的引用,但有指向指针的指针,并且没有引用数组而是指针数组。

谁能给我任何理由?

【问题讨论】:

  • 因为 Bjarne Stroustrup 这么说。
  • 这样无聊的答案。如何回答为什么标准不允许它? c++ 不支持重新绑定引用有什么根本原因吗?
  • @Caspin:当以这种方式限制时,可以将引用实现为符号表中的别名(即,它没有分配它自己的存储空间,并且一旦发生代码生成就不再存在),并且因为 c++从 c 继承的指针,它不需要在引用中构建更复杂的行为。

标签: c++ reference


【解决方案1】:

指针是可变的(如果是非常量),永远不会引用。因此,没有指向引用的指针或引用。

此外,引用必须始终引用某些东西——没有空引用这样的东西。这就是为什么不能有引用数组的原因,因为无法将数组内的引用默认实例化为有意义的值。

【讨论】:

  • 现在我们在 C++11 中进行了数组初始化,看起来可能有引用数组。
  • 一直有数组初始化,不明白为什么int& refs[2] = {x, y};是不道德的。
【解决方案2】:

它符合 C++ 标准 8.3.2/4:

不得有对引用的引用,不得有引用数组,也不得有指向引用的指针。

【讨论】:

  • 右值引用不是对引用的引用,尽管它们的语法 && 可能暗示了这一点。
  • -1 我很少投反对票,但我的意思是,这个答案的意义何在?这里的一些海报似乎将标准想象为一种圣书。首先,您需要一种有用且有意义的语言,然后才需要标准。
  • @Bill:当语言由标准定义时,如何先有语言然后才有标准? C++ 语言仅由标准定义;任何关于 C++ 的问题都只能用标准中的信息来回答。你会建议什么作为答案?
  • @GMan。你误解了世界是如何运作的。 C++ 标准化发生在 C++ 创建并发现有用之后。你真的认为花费大量精力创建一个非常详细的标准(如 C++ 标准)作为启动该语言的第一步是合理的吗?不,这些东西有机地工作,有人有一个想法,制作一个玩具编译器,向其他人展示它,它建立了动力(或没有),最终你可能会得到类似 C++ 标准的东西。我会提出一个解释,解释为什么 C++ 的这个特性是有意义的。其他人已经提供了。
  • FredOverflow,看来你是对的。仍然没有指向右值引用的指针。
【解决方案3】:

引用是语言级别的抽象。这是一种将变量别名为另一个变量的不透明方式。虽然在幕后,编译器可能会使用指针来计算引用,但它们在更高级别上是非常不同的东西。另一方面,程序员显式使用指针来实现间接寻址。指针变量是与其所指向的不同的变量。引用应该被认为只是原始变量的别名,而不是另一个保存地址的变量。因此,变量别名的别名只是变量本身的别名。考虑到绑定对变量的引用是编译时的事情,这可能有助于理解这种行为背后的基本原理。

根据这种推理,您可以争辩说,由于数组是存储值而不是变量的结构,因此它们能够存储变量的别名是没有意义的。基本上,一个引用变量(我的意思是指针,如果存在,编译器可以使用它来连接引用)在 C++ 级别对程序员是不可见的。如果可以声明引用数组,编译器可能需要要求传递给数组的常量索引才能在编译时解析绑定。

【讨论】:

  • 这是唯一真正解释为什么标准不希望任何实现允许引用数组的答案。
【解决方案4】:

C++ 标准 8.3.2/4:

There shall be no references to references, no arrays of references, and no pointers to references.

这背后的原因是在运行时引用本身并不存在。引用只是位置的另一个名称。它们是不可变的。

【讨论】:

  • 引用占用内存。例如,检查struct X { int &x; long &x; } 的大小。
  • David,为简单起见省略了构造函数。
  • 运行时存在大量引用。检查您的二进制调用堆栈。看看他们的地址指向你的对象! :)
猜你喜欢
  • 2017-06-26
  • 1970-01-01
  • 2018-01-10
  • 2012-04-27
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多