=====
class my_iterator { using iterator_concept = std::random_access_iterator_tag };
class my_sender { using sender_concept = std::execution::sender_t; }
=====
Oops, the first ends with `_tag` and the second ends with `_t`. But they share the same effect (to make a class satisfy a particular concept). Should we unify them?
Hmmm, before that let's see where we use `_tag` and `_t` in C++ standard library.
xxx_t:
1. <type_traits>. When we have `add_const<T>::type`, we typedef an `add_const_t<T>`.
2. Typedef which unifies different platforms. `uint8_t`, `wchar_t`, `clock_t`, etc.
3. Utility type of global constexpr variable. e.g. nullopt_t, unexpected_t, etc.
4. Utility type of function overload parameters. e.g. unique_lock(defer_lock_t), vector(from_range_t), etc.
xxx_tag:
1. Customize xxx_concept in class. e.g. using iterator_concept forward/bidirectional/.../random_access_iterator_tag.
Should we rename `std::execution::sender_t` into `std::execution::sender_tag`?
Thank you!