I was curious why std::vector<>::pop_back() does not return the popped value. Instead, there is a pair of methods: void pop_back() and const_reference back() const.
The answer was obvious when I tried to implement a vector-like class myself. Here is the code for an implementation of a would-be T std::vector<>::pop_back():
T pop_back()
{
FSize -= 1;
// call copy ctor
T Copy( FArray[ FSize ] );
// call dtor
FArray[ FSize ].~T();
// return the copy - this can raise an exception,
// but the value has been already popped from the stack
return Copy;
}
The implementation of the canonical pop_back() is straightforward and does not perform any redundant fuss with copying:
void pop_back()
{
FSize -= 1;
// this is exception safe since the dtor never throws
FArray[ FSize ].~T();
}