philnik added a comment.

In D151625#4380735 <https://reviews.llvm.org/D151625#4380735>, @erichkeane 
wrote:

> I'm a little dense today perhaps, but I don't get the use case for this?  Can 
> you ELI-EWG?  Is this an attribute we expect our users to use?  The name is 
> horrifyingly long for users to use, but perhaps that is a good thing.

This is useful for libraries which have ADL requirements. Something like

  template <class T>
  struct Holder {
    T v;
  };
  
  struct Incomplete;
  
  template <class T>
  class TupleImpl {
    T v;
  
    bool operator==(const TupleImpl&) const = default;
  };
  
  template <class T>
  class Tuple : public TupleImpl<T> {
    bool operator==(const Tuple&) const = default; // ADL call here
  };
  
  void func() {
    Tuple<Holder<Incomplete>*> f; // Instantiation fails because Incomplete 
isn't defined
  }

has to work for `std::tuple` etc. to make them 
`__is_trivially_equality_comparable`, but the defaulted `operator==` will 
always try ADL (at least that's my understanding). To not make ADL calls, this 
attribute can be used instead, which basically say "trust me, my operator== 
does what the defaulted one would do".

Not sure what you mean by "Can you ELI-EWG?".
I agree that the name isn't great, but I couldn't come up with anything better 
that is still descriptive, and this attribute will probably only be used by 
very few libraries anyways (maybe just libc++, since this is pure QoI). As I 
said in the attribute description, the defaulted operator should be used if 
possible (which is probably the case in 99.9% of use cases).

(Note to self: maybe add the example as a test)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151625/new/

https://reviews.llvm.org/D151625

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to