Por que o shared_ptr não pode resolver os relacionamentos de herança na interface de função?

Aqui está umexemplo simplificado:

#include <memory>
#include <vector>

template< class T >
class K 
{
public:
    virtual ~K(){}
};

class KBOUM : public K<int>{};

template< class U >
void do_something( std::shared_ptr< K<U> > k ) { }

int main()
{
   auto kboom = std::make_shared<KBOUM>();
    do_something( kboom );  // 1 : error

   std::shared_ptr< K<int> > k = kboom; // 2 : ok
   do_something( k ); // 3 : ok

}

Com ou sem boost, qualquer que seja o compilador que eu uso, recebo um erro no # 1 porqueshared_ptr<KBOOM> não herde deshared_ptr<K<int>> . Contudo,KBOOM herda deK<int>. Você pode ver que # 2 funciona porque shared_ptr é projetado para permitir implicitamente passar um ponteiro de classe filho para um ponteiro de classe base, como ponteiros brutos.

Então minhas perguntas são:

o que impede que o implementador std :: shared_ptr faça funcionar no caso # 1 (quer dizer, assumindo que o padrão evita este caso, deve haver uma razão);existe uma maneira de escreverauto kboom = std::make_shared<KBOUM>(); do_something( kboom ); sem olhar o tipo int de K do qual o KBOOM herda?

Nota: eu queroevitar o usuário da função ter que escrever

std::shared_ptr<K<int>> k = std::make_shared<KBOOM>();

ou

do_something( std::shared_ptr<K<int>>( kboom ) );

questionAnswers(3)

yourAnswerToTheQuestion