Моя программа имеет эту функцию:
vector<itemPtr> Level::getItemsAt(const Point& pt)
{
vector<itemPtr> vect(items.size());
// copy all items at pt's position to vect
remove_copy_if(items.begin(), items.end(), vect.begin(),
boost::bind(matchesPosition<itemPtr>, _1, pt));
// update LevelMap and return
map.setHasItem(pt, false);
return vect;
}
Это прекрасно компилируется (я использую g ++, моя версия gcc 4: 4.4.1-1ubuntu2), но когда я запускаю программу, она пропускает сразу оператор return.
Я прошел через GDB, установив точку останова на предыдущей строке, и получил это:
Breakpoint 1, yarl::level::Level::getItemsAt (this=0x80d4d58, pt=...)
at src/Level.cpp:519
519 map.setHasItem(pt, false);
(gdb) next
521 }
(gdb)
Я несколько раз пытался перекомпилировать с нуля, предварительно удалив исполняемый файл и все объектные файлы, и он все еще делает это.
Странно, если я закомментирую оператор return и попытаюсь скомпилировать, он выдаст только warning: no return statement in function returning non-void
. Я бы подумал, что не предоставление оператора return в функции, которая возвращает что-то, было бы ошибкой компилятора, но я думаю, что нет.
Я понимаю, что это не так много, но у кого-нибудь есть идея, почему это происходит? Что проверить? На данный момент я даже не знаю, с чего начать.
РЕДАКТИРОВАТЬ: для уточнения, я компилирую с -O0
.
Согласно tjm, моя версия gcc по-прежнему будет использовать RVO даже с флагом компилятора -O0
, так что в конце концов это была проблема. Спасибо за вашу помощь, ребята.