Hey
I'd like to point out
https://wg21.link/p1887r1 - Reflection on attributes which have a different goal (being able to reflect on user defined attributes), but a similar conclusion:
attributes would be in general that much more usable if they were declared before being used.
My approach at the time (this is not something I'm currently actively pursuing as reflection has not progressed) was to use defined attributes as good old c++ structs with a constexpr constructor,
which allow for different overloads and can do some validation - without adding new syntax.
I don't know if you would find this approach suitable, but maybe we can converge on a solution.
Alas, because of the whole "attribute can be ignored even if compilers warn on unknown attribute" thing, it's likely that people will want a new syntax...
This is the feedback I got at the time anyway.
struct my_attr {};
[[my_atr()]] void foo(); // typo or other attribute that should be ignored?
[[+my_atr()]] void foo(); // some kind of sigil might be necessary.
Have a great day,
Corentin