Причина заключается не столько в эффективности, сколько в безопасности исключений. Класс контейнера может использоваться для хранения любых объектов. Было бы невозможно реализовать pop_back () безопасным образом, если функция вернет объект после его удаления из контейнера, так как возврат значения объекта связано с построением копии.
Это фактическое реализация vector :: pop_back () в стандартной библиотеке GNU C ++:
void
pop_back()
{
--this->_M_impl._M_finish;
this->_M_impl.destroy(this->_M_impl._M_finish);
}
Это будет выглядеть так, как если бы он возвращал последний элемент в конце:
value_type
pop_back()
{
value_type save = back();
--this->_M_impl._M_finish;
this->_M_impl.destroy(this->_M_impl._M_finish);
return save;
}
Это включает в себя две структуры копирования, в операторе save = back()
и при возврате копии объекта. Нет никаких гарантий того, что выражение return не будет генерировать исключение после уничтожения элемента из контейнера.