无论我做什么,我总会得到相同的错误信息。也许有人知道我可以改变什么。
这是我的剧本:
void SendInventoryCustom(Player* player, Creature* vendor, int guid)
{
std::vector<ItemList> vendors = GetVendorList();
ItemList myVendor;
for(int i = 0; i < vendors.size(); i++)
{
if(vendors[i].GetVendor().getGuid() == guid)
{
myVendor = ItemList(&vendors[i].GetVendor(), &vendors[i].GetVendor().items);
break;
}
}
SmsgListInventory inventory_packet(vendor->GetGUID(), player->GetSession(), &myVendor.GetVendor().items, vendors);
inventory_packet.Send(vendor, player);
}
在编译期间,我收到以下错误消息:
1266:59: error: taking address of temporary [-fpermissive]
第1266行以:
开头myVendor = ItemList(&vendors[i].GetVendor(), &vendors[i].GetVendor().items);
这就是完整的脚本:
http://pastebin.com/DNnyjEeT
如果有人能帮我解决问题,我将非常感激 在此先感谢,最好的问候!
答案 0 :(得分:6)
遇到警告时,您需要了解每个术语(可能需要进行一些研究)。
在C ++中,临时是在评估表达式时出现的未命名对象,例如:
int a = 5 + 3 * 6;
相当于:
int a = operator+(5, operator*(3, 6));
operator*(3, 6)
的结果是int
类型的临时结果,这意味着编译器正在将代码重写为:
int __1 = 3 * 6;
int a = 5 + __1;
这可能在许多情况下发生,例如:
int foo();
int a = 5 + foo(); // converted to `int __foo = foo(); int a = 5 + __foo;`
所以,现在接到警告,获取临时的地址有什么问题?
问题在于语言只保证临时生命直到完整表达结束(基本上,直到;
)。因此,获取其地址(或创建对它的引用)会留下一个悬空指针:一个指向下界的指针。
所以,你可以正式拿走这个地址,但是之后你永远不应该尝试访问它的价值......
实际上,允许编译器(并且gcc在4.7中引入它)重用临时对象占用的内存,从一个表达式到另一个表达式,因为它们永远不会共存。如果您将之前“捕获”的地址用于临时,则可能会因此意外覆盖另一个对象!
考虑:
void foo(int* a, int b) { std::cout << (*a + b) << "\n"; }
int* i = &(5 + 3);
foo(i, 7 + 6);
可以翻译成:
int __1 = 5 + 3;
int* i = &__1;
__1 = 7 + 6;
foo(i, __1); // equivalent to `foo(&__1, __1);`
答案 1 :(得分:4)
在代码片段中
&vendors[i].GetVendor()
根据标准,将address-of运算符应用于非左值对象是不允许的。有些编译器可能会允许它带有警告或编译器覆盖,但要记住,它的结构不合理,应该避免使用。
将函数调用的返回值分配给对象,本地/非本地lvalue
,然后获取对象的地址。
引用标准
§5.3.1一元运算符,第3节
一元&amp;的结果operator是指向其操作数的指针。该 操作数应为左值或合格标识。