错误:获取临时[-fpermissive]的地址 - npc_multivendor

时间:2014-01-26 15:45:13

标签: c++

无论我做什么,我总会得到相同的错误信息。也许有人知道我可以改变什么。

这是我的剧本:

    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

如果有人能帮我解决问题,我将非常感激 在此先感谢,最好的问候!

2 个答案:

答案 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是指向其操作数的指针。该   操作数应为左值或合格标识。

相关问题