While the overhead of returning an ordinary object by value may be acceptable in most cases, returning a container by value is much more expensive in terms of performance. For example:
vector f(int n) { vector vi(n); return vi; //extremely inefficient }
Remember that when you return an object by value from a function, the object copy-constructs itself on the stack. The process of copy-constructing a container consists of copy-constructing its elements one by one