
Steven Watanabe wrote:
I don't think that boost::function should provide a never empty guarantee for several technical reasons: a) Providing the guarantee has a runtime cost. Allowing empty Boost.Function objects is free.
It only has a cost if the object doesn't have a no-throw move, and almost all types should be able to provide that.
b) Looking forward to C++0x, it is impossible to implement a no throw move for objects than have no empty state.
Moving itself almost never needs to throw, I think, except when they need to register their address in a global collection of something like that. The problem is that the destructor will still be called on the old object, so that object needs to be in a valid deletable state while not putting any side-effect on the new object. That does require an empty state in some cases, but that state could only be reached from the move constructor. T::T(T&& o) could make 'o' empty, but there could be no other way to make 'o' empty otherwise. (I personally wonder if it wouldn't have been better to not call destructors on moved objects)