简而言之,我有一个简单的指针:
int* a;
现在,我想改变这个指针的值。我想在一个函数中执行此操作。函数确保它不会更改指针指向的对象,但会更改指针本身。这就是为什么我希望这个函数采用这样的参数:非常量引用(因为指针的值将被更改)到指向常量对象的非常量指针(指针本身可以更改)(函数保证该对象,该指针指向的内容不会改变)。
最简单的函数是:
void function(const int*& a){
a = 0;
}
但是当我尝试调用这个函数时:
int main(){
int* a;
function(a);
return 0;
}
编译器不高兴地说:
从“const int*”类型的右值对“const int*&”类型的非常量引用进行无效初始化
函数(a);
我不太理解这个错误,因为对我来说不涉及右值(我正在传递对对象的引用,该对象已经存在于堆栈中。)
问题是,我怎样才能正确地做到这一点?
示例可以在这里找到:https://ideone.com/D45Cid
EDIT:
有人建议,我的问题类似于为什么将“指向非常量指针的指针”转换为“指向常量指针的指针”不合法
我的问题不同,因为我不使用指向指针的指针,我只使用指向对象/值的指针并存储对其的引用,因此情况类似于该问题的答案:
const char c = 'c';
char* pc;
const char** pcc = &pc; // not allowed
*pcc = &c;
*pc = 'C'; // would allow to modify a const object
在我的情况下是不可能的,因为我无法取消引用顶级指针(我没有这样的指针)。
此外,我对这个问题的良好和干净的解决方案提出了疑问,这没有在问题中涵盖