在 Eclipse 中获取临时地址时出错

Error taking address of temporary in Eclipse

本文关键字:地址 出错 获取 Eclipse      更新时间:2023-10-16

下面的代码在Visual Studio 2010上成功编译。 但是,当我在Linux Eclipse上编译它时,我收到一个错误:

../src/test.cpp:23:27:错误:获取临时地址 [-允许]

MyNode *p1 = &(MyNode)*itr;

为什么?我必须更改什么?

代码:

#include <stdlib.h>
#include <stdio.h>
#include <map>
#include <list>
using namespace std;
typedef struct MyNode_
{
int abc;
}MyNode;
int main() {
list<MyNode> myList;
list<MyNode>::iterator itr;
for(itr=myList.begin(); itr != myList.end(); ++itr)
{
MyNode *p1 = &(MyNode)*itr; //this line cause compilation error in Eclipse
printf("abc = %d", p1->abc);
}
return 0;
}

阻力最小的路径是根本不使用指针:

printf("abc = %d", itr->abc);

如果您确实需要itr表示的MyNode的地址,请使用&*itr

解释:

itr是一个std::list<MyNode>::iterator.您可以使用*运算符 (*itr( 获取对它表示的MyNode的引用。不需要强制转换,因为结果已经是MyNode。从此引用中,您可以获取引用MyNode的地址 (&*itr(。 把这一切放在一起,你会得到

MyNode *p1 = &*itr;
printf("abc = %d", p1->abc);

如果你真的必须这样做,那就这样做:

MyNode copy = *itr;
MyNode *p1 = &copy;

正如评论所说,尝试获取临时地址是行不通的,因为临时在他们使用的行之后没有有效的内存地址。

[expr.static.cast] p1 指出:

如果 T 是对函数类型的左值引用类型或右值引用,则结果为

左值;如果 T 是对对象类型的右值引用,则结果为 x值;否则,结果为 prvalue。

在这种情况下,您不会强制转换为引用类型,因此,表达式是 prvalue。现在,看看 [expr.urnary.op] p1:

一元 * 运算符执行间接寻址:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针,结果是引用表达式指向的对象或函数的左值。

表达式(MyNode)*itr是一个 prvalue,因此,它的格式不正确。