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

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引用?

这个设计背后的理念是什么?


1
你期望 const 限定符会阻止你做什么? - Nate Eldredge
3个回答

8

C++中的引用和指针有几个本质上的不同之处。其中一个区别是:

一旦创建了引用,就不能将其引用另一个对象;它不能被重新赋值,这通常使用指针来实现。

这意味着 引用 在 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限定符,这就是编译器禁止使用它的原因。
请查看此链接了解为什么C++中的引用不可重新赋值?。我复制了上述链接的已接受答案:
在Stroustrup的《C++设计与演化》一书中,给出了C++不允许重新绑定引用的原因:
“初始化后不可能更改引用所引用的内容。也就是说,一旦初始化了C++引用,它就不能稍后指向不同的对象;它不能被重新绑定。过去,我曾被Algol68引用咬过,其中r1=r2可以通过r1分配到所引用的对象或将新的引用值分配给r1(重新绑定r1),具体取决于r2的类型。我想避免在C++中遇到这样的问题。”
编辑:
请查看此链接,了解const指针和引用之间的区别?(感谢@M.M指出我的陈述存在歧义)。

1
引用和 const 指针之间有许多差异,这种教学方法是危险的。 - M.M
感谢您指出我陈述中的歧义。我已经编辑了我的回答! - abhiarora

4
为什么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
如果您的意思确实是这样,最好说它们不能重新绑定到另一个目标。引用是可以被修改的,只不过修改是针对目标完成的。 - paxdiablo
2
@xmllmx 这会修改所引用的对象,但引用本身不会被修改,即它仍然指向 n1。指针等价形式为 int n1, n2; int* const m = &n1; *m = n2; 请注意指针的常量性并不会阻止赋值。此外,由于 n2 具有不确定的值,因此它具有未定义的行为。 - eerorika
1
@xmllmx,它改变了m/n1的值,但并没有重新绑定引用。 - paxdiablo

2
  int& const m = n; 

我认为,由于编译器的本质特性,它是固有的常量。

 int n ; 

n具有固有的常量引用

因此,它在解析代码时只需确定const限定符允许存在的位置,通过编译器规则方法进行解析,如果不允许,则会出现错误/警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接