aaron.ballman added inline comments.
================ Comment at: libcxx/include/regex:2520 + _LIBCPP_PREFERRED_NAME(wregex) + basic_regex { ---------------- rsmith wrote: > Quuxplusone wrote: > > Why does this attribute go on the class template? Shouldn't it be an > > attribute on the typedef, so that you don't have to repeat yourself? I > > mean, I'd much rather see > > > > template<class T> class BasicFoo { }; > > using [[preferred]] Foo = BasicFoo<A>; > > using [[preferred]] WFoo = BasicFoo<B>; > > > > than > > > > template<class> class BasicFoo; > > using Foo = BasicFoo<A>; > > using WFoo = BasicFoo<B>; > > template<class T> class [[preferred(Foo, WFoo)]] BasicFoo { }; > > > > The latter repeats every identifier one extra time, compared to the former. > > > > And then, in fact, couldn't you go one step further and say that typedefs > > in the same scope as the class template itself should //always// implicitly > > have this attribute? Even if the attribute doesn't appear in the source > > code, we still want to print `basic_regex<char>` as `regex`, right? It > > shouldn't cost any additional work for the compiler to figure that out. > I don't think we want arbitrary typedefs to be able to declare themselves to > be names for the class template after the fact: this is a decision that the > (author of the) template itself should be making, not a decision for the > (author of the) typedef. Also, we need the information when looking at the > class template, not when looking at the typedef, so attaching it to the > typedef would require us to internally attach it to the class template > instead anyway, and generally it's undesirable and problematic to mutate an > existing declaration -- it's much cleaner to introduce new properties of a > declaration by redeclaring it. It's certainly not ideal that this results in > extra forward declarations in some cases, but given that this attribute is > only expected to be written a few dozen times in total, it doesn't seem worth > worrying about too much. > > I don't think we want typedefs to automatically get this behavior, even if > they're in the same namespace. I think it would be problematic if, for > example: > > ``` > namespace absl { > template<typename T> struct basic_string_view; > using format_arg = basic_string_view<char>; > std::string format(format_arg, ...); > } > ``` > > ... resulted in `absl::string_view` sometimes displaying as the (to a user) > unrelated type `absl::format_arg` depending on (presumably) `#include` order, > and I don't think we want to be in the business of inventing heuristics to > pick the "right" typedef. > I don't think we want arbitrary typedefs to be able to declare themselves to > be names for the class template after the fact: this is a decision that the > (author of the) template itself should be making, not a decision for the > (author of the) typedef. +1 Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D91311/new/ https://reviews.llvm.org/D91311 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits