简单来说,我有一个简单的指针:
int* a;
现在,我想改变这个指针的值。我想在一个函数中这样做。函数确保它不会改变指针指向的对象,但会改变指针本身。这就是为什么我希望这个函数接受如下参数:非const引用(因为指针的值将被改变)到指向const对象的非const指针(指针本身可以改变)(函数保证,该对象,指针指向不会改变。)
最简单的功能是:
void function(const int*& a){
a = 0;
}
但是当我尝试调用此函数时:
int main(){
int* a;
function(a);
return 0;
}
编译器不满意并说:
'const int *&'类型的非const引用的无效初始化来自'const int *'类型的右值 函数(a)的
我无法理解这个错误,因为对我来说没有涉及rvalue(我传递的是对象的引用,已经存在于堆栈中。)
问题是,我该怎么做呢?
示例可在此处找到: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
在我的情况下是不可能的,因为我无法取消引用顶级指针(我没有这样的指针)。
此外,我质疑这个问题的清晰解决方案,这个问题没有涉及
答案 0 :(得分:9)
我无法理解这个错误,因为对我来说没有涉及rvalue(我传递的是对象的引用,已经存在于堆栈中。)
int*
和const int*
是不同的事情。当您将a
类型int*
传递给function(const int*&)
时,需要首先将其隐式投放到const int*
,这是暂时的,即rvalue,并且不能绑定到非const referece。这就是编译器抱怨的原因。
问题是,我该怎么做呢?
您可以更改a
的类型或function()
的参数类型以使它们完全匹配(如果您未能更改由此指定的值,则可能为const int*
指针),避免隐式转换和临时变量。或者@TartanLlama建议,从function()
返回指针的新值。
答案 1 :(得分:2)
我不太确定你想要实现的目标。
但这段代码可能会对您有所帮助。 它应该指向你如何做你想做的事。
#include <iostream>
using namespace std;
int A = 1;
int B = 2;
int C = 3;
void change_pointer(int*& a){
// your pointer will point to B
a = &B;
}
void change_value(int* const& a) {
// the reference to pointer is constant, but not the value
// a=&C; wouldn't work
*a = C;
}
int main(){
int* a;
// at this point a is an undefined pointer to an int
// *a is unallocated space
a=&A; // you initialize the pointer with an other pointer
cout << "*a = " << *a << ", A = " << A << ", B = " << B << ", C = " << C << endl;
change_pointer(a); // makes 'a' point to B
cout << "*a = " << *a << ", A = " << A << ", B = " << B << ", C = " << C << endl;
change_value(a); // changes the value pointed by a to C (in the process modifying the value of B)
cout << "*a = " << *a << ", A = " << A << ", B = " << B << ", C = " << C << endl;
return *a;
}
编辑: 回答TartanLlama的评论。
我能看到使用“非常规引用”到“const int”的“非常量指针”的唯一方法是使用typedef
:
#include <iostream>
using namespace std;
typedef const int const_int_t;
const_int_t A = 1;
const_int_t B = 2;
void change_pointer(const_int_t*& a){
// your pointer will point to B
a = &B;
}
int main(){
const_int_t* a;
a=&A; // you initialize the pointer with an other pointer
cout << "*a = " << *a << ", A = " << A << ", B = " << B << endl;
change_pointer(a); // makes 'a' point to B
cout << "*a = " << *a << ", A = " << A << ", B = " << B << endl;
return *a;
}