Это не сразу небезопасно само по себе, но есть вероятность, что вы будете неправильно его использовать .
Все, что делает ваш код - это делает копию элемента, на который указывает последний элемент queue
. Отменяя элемент в очередь, вы теряете указатель на него, и теперь у вас нет возможности освободить этот оригинальный объект в случае, если он был динамически создан.
Правильный пример (без динамических объектов, без утечек):
QQueue<Foo*> q;
{
Foo a;
q.enqueue(&a);
Foo b = *q.dequeue();
}
Нерабочий пример (утечка динамического объекта):
QQueue<Foo*> q;
q.enqueue(new Foo); // eeew, naked "new" in C++...
Foo c = *q.dequeue();
// now the newed element is leaked
Вы правы в том, что c
благополучно уничтожен в конце своей области видимости, но вы выталкиваете оригинальный, новый объект, на который у вас нет указателя или ссылки.