Como forçar a dedução do argumento do modelo de classe ao construir uma classe em suas próprias funções de membro?

Considere o seguinte código:

struct A {};

template <typename T> struct B
{
    B(T) {}
    auto foo() {return B(A{});} // error: no matching function for call to 'B<int>::B(A)'
};

auto foo() {return B(A{});} // compiles

int main()
{
    foo();
    B b(0);
    b.foo();
}

Experimente ao vivo

Eu entendo porqueB::foo() não compila: dentro destruct B<T>, B (como um nome de classe injetado) significaB<T> a menos que seja explicitamente usado como modelo. O que, neste caso, impede a dedução do argumento do modelo de classe.

Digamos que não posso fazerauto foo() {return B<A>(A{});} já que meu código real se baseia em guias de dedução fornecidos pelo usuário um pouco elaborados.

A questão é: como forçar a dedução do argumento do modelo de classe ao construirB dentro deB::foo?

Espero não estar perdendo algo óbvio.

questionAnswers(2)

yourAnswerToTheQuestion