在 Eclipse 中获取临时地址时出错
Error taking address of temporary in Eclipse
下面的代码在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 = ©
正如评论所说,尝试获取临时地址是行不通的,因为临时在他们使用的行之后没有有效的内存地址。
[expr.static.cast] p1 指出:
如果 T 是对函数类型的左值引用类型或右值引用,则结果为左值;如果 T 是对对象类型的右值引用,则结果为 x值;否则,结果为 prvalue。
在这种情况下,您不会强制转换为引用类型,因此,表达式是 prvalue。现在,看看 [expr.urnary.op] p1:
一元 * 运算符执行间接寻址:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针,结果是引用表达式指向的对象或函数的左值。
表达式(MyNode)*itr
是一个 prvalue,因此,它的格式不正确。
相关文章:
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- 访问者访问变体并返回不同类型时出错
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 在 Eclipse 中获取临时地址时出错
- 获取WinPcap地址信息时出错
- Visual Studio在打印函数地址时出错
- C++:将自己结构的地址作为参数传递给pthread_create时出错:What覆盖了我的数据