关于返回指向const数据的const指针的引用的技术问题咨询
关于指向const数据的const指针引用的问题解析
嘿,我完全懂你碰到的这个坑——本来用const int*&返回引用时,能正常通过引用修改指针的指向(但改不了c的值,这符合预期),可当你想禁止通过这个引用修改指针本身时,随便加个const反而编译报错,对吧?咱们把这个问题拆明白。
首先得先理清楚几个容易搞混的类型:
const int*:这是指向const int的指针——指针本身可以改(比如让它指向别的const int变量),但指针指向的内容不能改(因为c是const的)const int* const:这是指向const int的const指针——指针本身不能被重新赋值(不能改指向),同时指向的内容也不能改- 而你原来的
get_pC返回的是const int*&,也就是一个指向const int*类型指针的引用
你现在的需求是:禁止通过引用r修改指针的指向(也就是不能让r重新指向别的地址),同时保持指向的c不能被修改。那你需要的不是给引用随便加const,而是要把引用绑定的指针类型改成const指针,也就是用const int* const&来声明r。
举个实际的代码例子帮你理解:
const int c = 10; const int another_c = 20; struct A { const int* pC = &c; }; struct B { A* pA = new A(); }; // 原函数:返回指向const int指针的引用 const int*& get_pC(B& b) { return b.pA->pC; } int main() { B b; // 原来的写法:可以修改r的指向,比如让它指向another_c const int*& r = get_pC(b); r = &another_c; // 这是合法的 // 你想要的写法:禁止修改r的指向 const int* const& r_const = get_pC(b); // r_const = &another_c; 这行代码会编译报错,达到了禁止修改指针指向的目的 // 同时*r_const = 30; 本来就会报错,因为c是const的 }
为什么你直接给r加const会报错?因为如果你写成const const int*& r,这其实和原来的const int*& r完全等价——const修饰的是指向的内容,而不是指针本身。要修饰指针本身,必须把const放在*的右边,也就是const int* const,再加上引用&,才是你需要的类型。
总结一下:
- 若允许修改指针指向,但不能修改指向的内容:用
const int*& - 若既不允许修改指针指向,也不能修改指向的内容:用
const int* const&
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

