"expression must be an l-value or function designator"取地址时出错

"expression must be an l-value or function designator" error when taking the address of this

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

class Abc
{
   int callFunction1()
};

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

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

我在 visual studio 2015 年遇到 "expression must be an l-value or function designator" 错误。所以我不明白哪里出错了。据我所知,&this 的类型应该是 Abc** 对吗?

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

错误很明显。因为 this 不是左值,所以你不能获取它的地址。如果你只是想要对象的地址,那么只要传递this,而不是&this,并将函数声明更改为:

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

但是,既然你提到你不能改变函数的定义,你可以创建一个临时变量并传递它的地址:

auto temp = this;
function1(&temp);

这是如何工作的:

  1. 因为 this is a prvalue 并且不能获取它的地址,你需要一些东西指向它以将它变成一个左值,这里 temp.
  2. 现在 temp 指向 this,获取 temp 的地址将有效地获取 this 的地址,尽管是间接的。
  3. 因此,由于您将左值的地址传递给 function1,因此代码会按预期进行编译和工作。

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

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

auto* ptr = this;
doSomething(&ptr);

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

1 In the body of a non-static (9.2.1) member function, the keyword this is a prvalue expression whose value is the address of the object for which the function is called.

和(5.3.1 一元运算符)

3 The result of the unary & operator is a pointer to its operand. The operand shall be an lvalue or a qualified-id....

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

例如,如果您有声明

int x = 10;

那你可以不写

int **p = &&x;

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

你可以写

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

因为 qlvalue