C++:为什么我们不能引用引用或引用数组?

sky*_*oor 11 c++ reference

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

有人能给我任何理由吗?

Pét*_*rök 15

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

此外,引用必须始终引用某些东西 - 没有空引用这样的东西.这就是为什么没有引用数组的原因,因为没有办法将数组内的引用实例化为有意义的值.


Kir*_*sky 12

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

不应引用引用,不引用引用数组,也不引用引用指针.

  • -1对于我来说非常罕见,但我的意思是,这个答案的重点是什么?这里的一些海报似乎想象标准是一种圣书.首先,您需要一种有用且有意义的语言,只有这样才是必要的标准. (7认同)
  • @Bill:当标准定义语言时,首先如何使用语言然后是标准?C++语言仅由标准*定义*; 任何关于C++的问题都只能通过标准中的信息来回答.你会建议什么作为答案? (4认同)

Meh*_*ari 10

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

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


Dav*_*fer 5

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; 的大小是多少 长&x; }` 例如。 (4认同)