【发布时间】:2021-12-14 04:15:56
【问题描述】:
我将 对指针变量的引用 传递给函数。该函数将做一些事情并将指针变量指向某个对象。代码:
int Foo(Obj* &ptr) {
// do something...
ptr = some_address;
return return_value;
}
int main() {
Obj* p = nullptr;
int ret = Foo(p);
// do something with ret
p->DoSomething();
}
但是,如果我想传递对 指向 const 的指针的引用,事情会变得更加棘手。我希望更改指针变量本身(因此引用),但我不希望使用此指针更改指向的 Obj 实例。在我的想象中,应该是这样的:
int Foo(const Obj* &ptr) {
// do something...
ptr = some_address;
return return_value;
}
int main() {
const Obj* p = nullptr;
int ret = Foo(p);
// do something with ret
p->DoSomething(); // this should only work when DoSomething() is const method
}
编辑:以下错误无法重现,因此被删除。本题关注的是指针引用的概念,而不是解决问题
C++ 给出这个编译错误:
main.cpp:22:10: error: cannot bind non-const lvalue reference of type ‘const Obj*&’ to an rvalue of type ‘const Obj*’ 22 | Foo(ptr); | ^~~ main.cpp:14:23: note: initializing argument 1 of ‘void test(const Obj*&)’ 14 | int Foo(const Obj* &ptr) { | ~~~~~~~~~~~~^~~
一些想法:
错误无法重现
- 我相信当我尝试将“未命名变量”传递到参考参数时会显示此错误。在这种情况下,我将传递变量
ptr,这应该不是问题。
-
ptr作为参数传入,因为函数有一个有用的返回值。设置ptr更像是这个函数的副产品,调用者可以选择忽略或使用。 -
我也可以尝试使用
Obj**作为参数,它是通过指针传递而不是通过引用传递。这在const Obj**作为参数传递时有效。我只是想知道如果参数通过引用传递会怎样。
【问题讨论】:
-
你用的是什么编译器?此外,您的错误消息与您的代码示例不匹配。该错误提到在 main.cpp 的第 14 行调用了一个名为
test的函数,但这显然是一个与您显示的程序不同的程序。 -
错误消息将错误代码列为
Foo(ptr)... 给出的代码不是产生错误消息的代码。ptr的确切类型是什么?? -
该代码添加了一个简单的
Obj实现,不会产生该错误。 -
很抱歉给您带来了困惑。我命名的测试函数是
test,而不是Foo。我把编译错误复制到SO后把test换成Foo,报错了…… -
至于编译器,我最初使用 clang++ 和 online GDB testing 编译了我的代码。但是我现在无法在两种环境中重现此错误(???)...我正在将此问题编辑为一个没有错误的问题。
标签: c++ pointers reference pass-by-reference pass-by-pointer