为什么C ++中没有像const指针那样的const引用?

问题描述 投票:3回答:3
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引用?

设计背后的原理是什么?

c++ pointers reference const standards
3个回答
3
投票

References在C ++中与指针在几个基本方面有所不同。区别之一是:

一旦创建引用,以后就不能再引用另一个对象;它无法重新放置。这通常是通过指针完成的。

这意味着Reference在默认情况下像const指针(不是指向const的指针!),在C ++中...

int a = 5;
int& m = a; // Same as int * const m = &a;

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

请参阅此link以学习Why are references not reseatable in C++?。我已经复制了上面链接的可接受答案:

C ++不允许您重新绑定引用的原因在Stroustrup的“ C ++的设计和演进”中给出:

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


2
投票
  int& const m = n; 

恕我直言,因为根据编译器的本质,它固有地是常数

 int n ; 

n具有固有常数参考

因此,在解析代码时,它只是确定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相同。

© www.soinside.com 2019 - 2024. All rights reserved.