ошибка: получение временного адреса [-fpermissive] — npc_multivendor

Независимо от того, что я делаю, я всегда получаю одно и то же сообщение об ошибке. Может быть, у кого-то есть идея, что я могу изменить.

Это мой сценарий:

    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

Я был бы очень признателен, если бы кто-то мог помочь мне с моей проблемой.
Заранее спасибо, С наилучшими пожеланиями!

5

Решение

В коде сниппер

&vendors[i].GetVendor()

Применение оператора address-of к объекту, не имеющему значения, не является обязательным в соответствии со стандартом. Некоторые компиляторы могут разрешить это с предупреждениями или переопределением компилятора, но помните, что он некорректен и его следует избегать.

Назначьте возвращаемое значение вызова функции для объекта, локального / нелокального lvalue а затем взять адрес объекта.

Стандарт цитирования

§5.3.1 Унарные операторы, раздел 3

Результат одинарный & Оператор является указателем на свой операнд.
операнд должен быть lvalue или квалифицированным идентификатором.

4

Другие решения

Когда вы сталкиваетесь с предупреждением, вы должны понимать каждый термин (который может потребовать некоторых исследований).

В 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);`
6

По вопросам рекламы [email protected]