获取此地址时出现“表达式必须是左值或函数指示符”错误

新手上路,请多包涵

我正在尝试在 C++ 中执行此操作:

 class Abc
{
   int callFunction1()
};

void function1(Abc** c1) {//do something}

int Abc::callFunction1()
{
   function1(&this);
   return 0;
}

我在 Visual Studio 2015 中得到“表达式必须是左值或函数指示符”错误。所以我不明白我哪里出错了。据我所知, &this 应该是 Abc** 类型,对吗?

函数定义不是我要更改的。所以我不能只改变参数类型。

原文由 disccip 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 984
1 个回答

错误很清楚。由于 this 不是左值,因此您无法获取其地址。如果您只想要对象的地址,则只需传递 this ,而不是 &this ,并将函数声明更改为:

 void function1(Abc* c1) //To just pass a pointer

但是,由于您提到无法更改函数的定义,您可以创建一个临时变量并传递其地址:

 auto temp = this;
function1(&temp);

这是如何工作的:

  1. 由于 this 是纯右值 并且不能获取其地址,因此您需要指向它以将其转换为左值,此处为 temp
  2. Now that temp points to this , taking temp ’s address will effectively take this ’s address, albeit indirectly.
  3. 因此,由于您将左值的地址传递给 function1 ,因此代码可以按预期编译和工作。

原文由 Arnav Borborah 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题