【发布时间】:2016-07-18 01:23:26
【问题描述】:
简单来说,我有一个简单的指针:
int* a;
现在,我想改变这个指针的值。我想在一个函数中做到这一点。函数保证,它不会改变指针指向的对象,但会改变指针本身。这就是为什么我希望这个函数采用如下参数:非 const 引用(因为指针的值将被更改)指向非 const 指针(指针本身可以更改)指向 const 对象(函数保证,该对象,指针指向的不会改变)。
最简单的函数是:
void function(const int*& a){
a = 0;
}
但是当我尝试调用这个函数时:
int main(){
int* a;
function(a);
return 0;
}
编译器不高兴,说:
从“const int*”类型的右值初始化“const int*&”类型的非常量引用无效 函数(a);
我不太明白这个错误,因为对我来说没有涉及右值(我正在传递对对象的引用,该对象已经存在于堆栈中。)
问题是,我怎样才能正确地做到这一点?
示例可以在这里找到:https://ideone.com/D45Cid
编辑:
有人建议,我的问题类似于Why isn't it legal to convert "pointer to pointer to non-const" to a "pointer to pointer to const"
我的问题不同,因为我不使用指向指针的指针我只使用指向对象/值的指针并存储对它的引用,因此情况类似于该问题的答案:
const char c = 'c';
char* pc;
const char** pcc = &pc; // not allowed
*pcc = &c;
*pc = 'C'; // would allow to modify a const object
在我的情况下是不可能的,因为我无法取消引用顶级指针(我没有这样的指针)。
此外,我对这个问题的良好和干净的解决方案提出了质疑,这个问题没有涉及
【问题讨论】:
-
我不确定您是否可以混淆指针和引用。嗯,你应该是 c++,但请不要。没有人会理解你的代码!
-
@Holt 我不能这样做。这是一个简单的例子,但是在后面的实际代码中我正在对这个对象进行操作,所以我不能将指针声明为 const
-
@hr0m 指向指针的指针比指向引用的指针更好?在我看来,这些有不同的含义。
-
@hr0m 我看不出对指针的引用有什么问题。如果你想接收一个指针并修改它,那么对指针的引用是这样做的自然方法。将指针指向要修改的指针意味着它可能为空,而引用则不是这样。
-
@hr0m:仅仅因为你不熟悉某事并不意味着这是不好的做法。指针的引用是任何 C++ 程序员都应该真正理解的东西。特别是,我不明白为什么双指针应该更容易理解。