C++11 Blocking Queue learning exercise
One of the aspects I would like to improve is efficiency i.e. in the take member function while returning the Job template type to be returned by reference instead of by value.


So what you would like is:

Job&amp; take()   ?


the problem is that you would return a reference to local variable which is Undefined Behaviour.

Just Job take() should be fine, compiler will use NRVO optimization so that no copy will be done, copy constructor call would be elided. You could return by moving: return std::move(job);, but that can prevent elision.

One place where you will have a copy constructor called is here:

Job job = queue_.front();


To prevent it you can implement move semantics into your Job class. Then replace above with:

Job job = std::move(queue_.front());


if you will not add any of the user defined constructor/destructor/assignment operator to your Job class, then compiler will add move constructor/assignment operator on  its own - depending whether it is possible.