10

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

class Abc
{
   int callFunction1()
};

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

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

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

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

4

3 回答 3

9

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

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

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

auto temp = this;
function1(&temp);

这是如何工作的:

  1. 因为this它是一个纯右值并且不能获取它的地址,所以你需要一些东西来指向它以将它变成一个左值,在这里temp
  2. 现在temp指向this,获取temp的地址 将有效地获取this的地址,尽管是间接的。
  3. 因此,由于您将左值的地址传递给function1,因此代码可以按预期编译和工作。
于 2017-09-20T20:05:33.610 回答
5

来自 C++ 标准(9.2.2.1 this 指针)

1 在非静态 (9.2.1) 成员函数的主体中,关键字 this 是一个纯右值表达式,其值是调用该函数的对象的地址。

和(5.3.1 一元运算符)

3 一元 & 运算符的结果是指向其操作数的指针。操作数应该是一个左值或一个合格的 id....

为了更清楚,请考虑以下代码片段。

例如,如果您有一个声明

int x = 10;

那么你可能不会写

int **p = &&x;

在正确的表达式&x中是 aprvalue并且根据标准的第二个引用,您可能不会将一元运算符&应用于prvalue.

你可以写

int *q = &x;
int **p = &q;

因为qlvalue

于 2017-09-20T20:18:38.150 回答
4

表达式this是一个右值,与表达式137or'a'的方式相同,因此您不能获取它的地址。

如果你想获得一个指向 的指针this,你需要创建一个正确类型的新变量:

auto* ptr = this;
doSomething(&ptr);
于 2017-09-20T20:12:15.620 回答