[PATCH] D37538: [libc++] Remove problematic ADL in container implementations.

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 14 18:50:51 PDT 2017


rsmith added a comment.

dlj and I discussed this offline somewhat, and dlj made the interesting point that using ADL *at all* within the implementation of the standard library brings with it the risk that your implementation will not function correctly if a user-declared operator could be at least as good a match as your intended callee.

As an example, consider: https://godbolt.org/g/rgFTME -- as far as I can see, that code follows all the rules for safe and correct use of the C++ standard library. And yet it does not compile with either libc++ or libstdc++, because both internally use ADL to find the `operator!=` for `vector::iterator` within their implementation of `vector::erase`. Any ADL call seems likely to suffer from this problem; moreover, you can observe that `vector<Foo>::iterator` fails to even satisfy the input iterator requirements, because `a != b` is not a valid expression for iterators `a` and `b`.

I think the above example is actually demonstrating a bug in the standard: such user code is unreasonable and it's not sensible to expect the standard library to cope with it.


https://reviews.llvm.org/D37538





More information about the cfe-commits mailing list