【问题标题】:Why no const reference in C++ just like const pointer?为什么 C++ 中没有 const 引用,就像 const 指针一样?
【发布时间】:2020-04-25 15:06:03
【问题描述】:
int main()
{
    int        n = 1;
    int* const p = &n; // ok

    *p = 2; // ok as expected. 
    p  = 0; // error as expected.

    int& const m = n; 
    // error: 'const' qualifier may not be
    // applied to a reference   

    return 0;
}

为什么在 C++ 中没有 const 引用,就像 const 指针一样?

设计背后的基本原理是什么?

【问题讨论】:

  • 您认为const 限定符会阻止您做什么?

标签: c++ pointers reference constants standards


【解决方案1】:

C++ 中的References 在几个基本方面与指针不同。不同之处之一是:

一旦创建了引用,以后就不能再引用另一个对象了;它不能被重新安装。这通常使用指针来完成。

这意味着Reference like 与 C++ 中的 const 指针(不是指向 const 的指针!)相似(请参阅此答案末尾的链接)。 ..

int a = 5;
int& m = a; // Behaves similar to int * const m = &a;
// See the link at the bottom for the differences between const pointer and reference.

因此,您不能更改/重新绑定它们以指向其他地址。因此,您不需要显式的 const 限定符作为引用,这就是编译器不允许使用它的原因。

查看此link 以了解Why are references not reseatable in C++?。我已复制上述链接的已接受答案:

Stroustrup 的《C++ 的设计与演进》中给出了 C++ 不允许重新绑定引用的原因:

初始化后无法更改引用所指的内容。也就是说,一旦 C++ 引用被初始化,它就不能在以后引用不同的对象;它不能重新绑定。我过去曾被 Algol68 引用所困扰,其中 r1=r2 可以通过 r1 分配给所引用的对象,也可以根据 r2 的类型为 r1 分配一个新的引用值(重新绑定 r1)。我想避免在 C++ 中出现此类问题。

编辑:

请参阅Difference between const pointer and reference?this 链接(感谢@M.M 指出我声明中的歧义)。

【讨论】:

  • 引用和 const 指针之间存在各种差异,这种教学法很危险
  • 感谢您指出我声明中的歧义。我已经编辑了我的答案!
【解决方案2】:

为什么在 C++ 中没有 const 引用,就像 const 指针一样?

无法修改引用。向不可修改的实体添加 const 限定将毫无意义且令人困惑。

请注意,技术上可以通过类型别名或模板类型参数间接将 const 应用于引用。示例:

T some_t;
using Ref = T&;
Ref const some_ref = some_t; // well-formed

Ref const 类型“折叠”成T&,与不合格的Ref 相同。我建议通常避免为指针和引用创建类型别名,除非它们是常规的。具体来说,Container::reference 类型别名和类似的都是常规的。

【讨论】:

  • int n1, n2; int& m = n1; m = n2; 怎么样?
  • 最好说它们不能重新绑定到另一个目标(如果这确实是您的意思)。引用可以修改,只是对目标做了修改。
  • @xmllmx 修改引用的对象。引用保持不变,即它仍然引用n1。等价的指针是int n1, n2; int* const m = &n1; *m = n2; 请注意指针的常量不会阻止赋值。此外,由于 n2 具有不确定的值,因此它具有未定义的行为。
  • @xmllmx,改变m/n1的值,它不会重新绑定引用。
【解决方案3】:
  int& const m = n; 

恕我直言,因为它本质上是编译器性质的常量,只是

 int n ; 

n 具有固有的常量引用

所以当它解析代码时,它只是通过用于解析的编译器规则方法确定 const 限定符只允许存在的任何位置,如果不允许,则转到错误/警告

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2010-09-18
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多