Date: Mon, 26 Aug 2013 21:52:23 +0300
On 26 August 2013 19:00, Jeffrey Yasskin <jyasskin_at_[hidden]> wrote:
> The library's running into problems because < is unspecified on
> pointers that don't point to the same object. (C++14CD[expr.rel]p4)
> Naively, this restriction makes a bit of sense, since we can't give a
> particular answer for any two pointers, but it's causing problems for
> some generic library components. Specifically:
>
> std::map<T*> works because std::less has a special case for pointers.
> ([comparisons]p14)
>
> std::map<std::tuple<T*>> gives undefined behavior because
> std::less<tuple> uses tuple's operator<, which uses T*'s operator<.
>
> std::map<std::optional<T*>> goes back to defined behavior because we
> special-cased optional's operator< to use std::less:
> [optional.relops]p4
>
I have strong reasons to believe we'll see an NB comment proposing std::less
to be specialized for tuple<T*> and containers.
> The library's running into problems because < is unspecified on
> pointers that don't point to the same object. (C++14CD[expr.rel]p4)
> Naively, this restriction makes a bit of sense, since we can't give a
> particular answer for any two pointers, but it's causing problems for
> some generic library components. Specifically:
>
> std::map<T*> works because std::less has a special case for pointers.
> ([comparisons]p14)
>
> std::map<std::tuple<T*>> gives undefined behavior because
> std::less<tuple> uses tuple's operator<, which uses T*'s operator<.
>
> std::map<std::optional<T*>> goes back to defined behavior because we
> special-cased optional's operator< to use std::less:
> [optional.relops]p4
>
I have strong reasons to believe we'll see an NB comment proposing std::less
to be specialized for tuple<T*> and containers.
Received on 2013-08-26 20:52:24