非const引用指向const对象的非const指针

Daw*_*dPi 10 c++ pointers reference

简单来说,我有一个简单的指针:

int* a;
Run Code Online (Sandbox Code Playgroud)

现在,我想改变这个指针的值.我想在一个函数中这样做.函数确保它不会改变指针指向的对象,但会改变指针本身.这就是为什么我希望这个函数接受如下参数:非const引用(因为指针的值将被改变)到指向const对象的非const指针(指针本身可以改变)(函数保证,该对象,指针指向不会被改变).

最简单的功能是:

void function(const int*& a){
    a = 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试调用此函数时:

int main(){
    int* a;
    function(a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器不满意并说:

从'const int*'函数(a)的rvalue初始化'const int*&'类型的非const引用;

我不太明白这个错误,因为对我来说没有涉及rvalue(我传递对象的引用,已经存在于堆栈中.)

问题是,我该怎么做呢?

可以在此处找到示例:https://ideone.com/D45Cid


编辑:

有人建议,我的问题是为什么将"指向非const的指针"转换为"指向const的指针"是不合法的.

我的问题是不同的,因为我没有使用指针指针我只使用指向对象/值的指针并存储对它的引用,因此情况就像在回答这个问题:

const char c = 'c';
char* pc;
const char** pcc = &pc;   // not allowed
*pcc = &c;
*pc = 'C';                // would allow to modify a const object
Run Code Online (Sandbox Code Playgroud)

在我的情况下是不可能的,因为我无法取消引用顶级指针(我没有这样的指针).

此外,我质疑这个问题的完美和干净的解决方案,这个问题没有涉及

son*_*yao 9

我不太明白这个错误,因为对我来说没有涉及rvalue(我传递对象的引用,已经存在于堆栈中.)

int*并且const int*是不同的事情.当你传递a类型int*function(const int*&),它需要const int*首先隐式地进行转换,这是临时的,即rvalue,并且不能绑定到非const引用.这就是编译器抱怨的原因.

问题是,我该怎么做呢?

您可以更改其类型a或参数类型function()以使它们完全匹配(可能是const int*您不会更改指针指向的值),以避免隐式转换和临时变量.或者@TartanLlama建议,返回指针的新值function().

  • 另一种选择是返回指针的新值,如果已经有返回值,则可能在结构或对中. (3认同)