I just noted that a deduction guide needs the stated return type to be exactly  the name of the class template whose instance is being deduced, a metafunction call is not allowed. In my use case I wanted a class template to adapt to the signature of a callable sent as constructor parameter. This does not seem to be possible in C++20.

I don't see a compelling reason to require the class template name to be written out verbatim after the -> of the deduction guide, at this point in the parsing the compiler knows that this is a deduction guide and which class template it is connected to, so it should be able to parse the rest exactly as if it was a trailing return type.

Here is the short form code, a complete example is at godbolt (https://godbolt.org/z/x91Pz6). All major compilers give similar error messages...

template<typename... Pars> class receiver {
public:
   using Func = std::function<void(Pars...)>;

    receiver(Func function) : m_function(std::move(function)) {}
  
private:
    Func m_function;
};

template<typename F> receiver(F&&)->detail::corresponding_type<receiver, F>;

The bold part offends the compiler although this meta function call yields a receiver template instance. During phase 1 parsing the compiler can only know that this yields a type (a typename specifier may be needed in some cases) but that should be enough for it to continue.

I can't figure out a workaround that allows me to create a receiver like this given this limitation:

receiver rec([](int, float) {doSomething(); });

I think this is a pity.

Bengt Gustafsson

PS: I just found on GodBoilt an experimental Clang version called NDSMI which allows auto and CTAD on data members. Does anyone know who did this and if it has a corresponding proposal? Such a feature would fit nicely with the relaxation I refer to here, to allow wrapping lambdas in member constructors and similar.