On 1/12/2014 13:58, Matt Calabrese wrote:
Anyway, why specifically do you consider a tuple having a default ordering as a bug? All it is is a lexicographical order, just like std::string and just like the other containers of the standard library. It just happens to be heterogenous and of a fixed size. Why do you consider it not "reasonable" to have a default ordering as a lexicographical ordering for tuples and yet consider it "reasonable" to have a default ordering as a lexicographical ordering for std::string? The distinction that is being made seems entirely arbitrary unless you or someone else can (1) specify unambiguously what that supposed difference actually is including how you would generalize that distinction, and (2) explain why such a difference is actually important with respect to defining a default ordering via std::less (or a proposed std::order). I don't buy the distinction being worthwhile either in practice or in theory. As far as I can tell it is arbitrary, inconsistent, and without any objective rationale.
Most containers do not implement ordering relations of the container
itself. String is an exception because people generally think of it as
a value type rather than as a container of chars.
Why should a std::pair
I'm sorry, but that is simply bad programming advice. Putting a tuple in a set is not using the "wrong" datastructure. A tuple can be correctly ordered just like any other type and the same is true of optionals or variants. There not being a single default order that everyone would expect without referencing documentation is completely separate from the choice of whether a programmer should use a set or an unordered set. Claiming that this should be a reason to choose one datastructure over another is horrible.
Define "correctly ordered" for an arbitrary tuple. If this definition can vary from application to application or from context to context, then the definition should not be baked in to the tuple itself, but instead supplied only where actually needed. (It sounds like you are arguing that in this case the programmer should specify the tuple type specifically with its library-mandated ordering characteristics in mind, instead of whatever other logical field order they prefer. Especially if different orderings are required in different contexts, the compile-time type seems like the wrong place to be defining this.) If the programmer does not require ordering, then why use a container that requires it, instead of one that does not? Unless there is some other deficiency of unordered_set vs. set (other than relative newness and unfamiliarity) that I am unaware of, this seems obvious to me, and I'm not sure why you seem to oppose it so strongly. (To me, a "set" should use equality only and should never have been ordered in the first place, but that ship has long sailed and it's pointless to discuss it further.)
What's with the "want" here? Why would you not want an order? I can see not needing it for a certain application and not minding if it's there, but you make it sound like it's somehow a bad thing for it to even exist. If you personally don't need it then you don't have to use it.
Except that where this whole discussion began was where someone was
using it unintentionally. If it wasn't there (unless specifically
requested), that wouldn't be an issue.
Perhaps your domain is different, but in my experience wanting to sort
things (particularly in a single way) is the exception rather than the
rule. Requiring types to be internally sortable therefore seems like an
unnecessary burden.
This is starting to get quite far afield from the original issue though.
The fundamental point was that using op< on distinct types (in this
case optional<T> and T) is more likely to be a bug than it is to be
intentional code. My generalisation was that even op< on two
optional<T>s is suspicious as some people don't seem to agree where
"none" sorts, or even what "none" means in some cases -- and because
others were arguing that it was inconsistent to define one op< without
the other.
My further generalisation was that it's probably also a bug to try to
order two variant