Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2001-08-17 07:27:21

From: "Darin Adler" <darin_at_[hidden]>
> On Thursday, August 16, 2001, at 05:07 PM, Scott McCaskill wrote:
> > I'd like to propose a minor addition to smart_ptr.hpp: operator<() for
> > comparing two shared_ptrs. Without such an operator, it's not possible
> > use shared_ptr in certain STL containers (such as set) without defining
> > one's own predicate.
> shared_ptr already has a specialization of std::less that accomplishes
> this. Some have made a good argument for using an operator < rather than
> std::less, but others like the current implementation. (I'll dig up the
> relevant messages in the Boost archives if you want me too.)

Here is my summary (from shared_ptr.hpp):

// Namespace std:: definitions removed (Peter Dimov)
// Rationale:
// std::swap() overloads are illegal (, LWG issue #226)
// std::less<> specializations that do not call operator< are illegal
// (, 20.3.3/5)
// std::less cannot be partially specialized on compilers that do not
// support the feature
// std::less specializations do not help in cases like
// map<pair<shared_ptr, int>, int>

I should also add that std::swap() is already fast and non-throwing for
shared_ptr, so breaking is not worth it.

> Given the current implementation, you should be able to use shared_ptr in
> a set. Have you tried it?

Not on a compiler that doesn't support partial specializations.

Peter Dimov
Multi Media Ltd.

Boost list run by bdawes at, gregod at, cpdaniel at, john at