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引用?
设计背后的原理是什么?
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 ++中出现此类问题。
int& const m = n;
恕我直言,因为根据编译器的本质,它固有地是常数
int n ;
n
具有固有常数参考
因此,在解析代码时,它只是确定const限定符仅在哪个位置存在,通过编译器规则方法进行解析,如果不允许,则转至错误/警告
为什么在C ++中没有像const指针那样的const引用?
参考不能被修改。向不可修改的实体添加const资格将毫无意义且令人困惑。
注意,从技术上讲,可以通过类型别名或模板类型参数将const间接应用于引用。示例:
T some_t;
using Ref = T&;
Ref const some_ref = some_t; // well-formed
[ref const
类型“折叠”为T&
,并且与不合格的ref
相同。