¿Por qué shared_ptr no puede resolver las relaciones de herencia en la interfaz de función?

Aquí hay unejemplo 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

}

Con o sin boost, cualquiera que sea el compilador que use, obtengo un error en el # 1 porqueshared_ptr<KBOOM> no heredar deshared_ptr<K<int>> . Sin embargo,KBOOM se hereda deK<int>. Puede ver que el # 2 funciona porque shared_ptr está diseñado para permitir pasar de forma implícita un puntero de clase secundaria a un puntero de clase base, como punteros en bruto.

Así que mis preguntas son:

qué impide que el implementador std :: shared_ptr lo haga funcionar en el caso # 1 (es decir, suponiendo que la norma previene este caso, debería haber una razón);¿hay una manera de escribirauto kboom = std::make_shared<KBOUM>(); do_something( kboom ); ¿Sin mirar el tipo int de K de donde KBOOM hereda?

Nota: quieroevitar El usuario de la función tiene que escribir.

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

o

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta