[over.match.class.deduct] (original) (raw)

[Example 3: template <class T, class U> struct C { C(T, U); };template<class T, class U> C(T, U) -> C<T, std::type_identity_t<U>>; template<class V> using A = C<V *, V *>;template<std::integral W> using B = A<W>;int i{};double d{}; A a1(&i, &i); A a2(i, i); A a3(&i, &d); B b1(&i, &i); B b2(&d, &d);

Possible exposition-only implementation of the above procedure: template <class> class AA;template <class V> class AA<A<V>> { };template <class T> concept deduces_A = requires { sizeof(AA<T>); };template<class T, class U> auto f1(T, U) -> C<T, U>;template<class V> requires deduces_A<C<V *, V *>> auto f1_prime(V *, V*) -> C<V *, V *>;template<class T, class U> auto f2(T, U) -> C<T, std::type_identity_t<U>>;template<class V, class U> requires deduces_A<C<V *, std::type_identity_t<U>>> auto f2_prime(V *, U) -> C<V *, std::type_identity_t<U>>;template <class> class BB;template <class V> class BB<B<V>> { };template <class T> concept deduces_B = requires { sizeof(BB<T>); };template<std::integral W> requires deduces_A<C<W *, W *>> && deduces_B<C<W *, W *>> auto f1_prime_for_B(W *, W *) -> C<W *, W *>;template<std::integral W, class U> requires deduces_A<C<W *, std::type_identity_t<U>>> && deduces_B<C<W *, std::type_identity_t<U>>> auto f2_prime_for_B(W *, U) -> C<W *, std::type_identity_t<U>>;

— _end example_]