"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);
这是如何工作的:
表达式 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;
因为 q
是 lvalue
。
我正尝试在 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);
这是如何工作的:
表达式 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;
因为 q
是 lvalue
。