Dlaczego shared_ptr nie może rozwiązać relacji dziedziczenia w interfejsie funkcji?

Tutaj jestuproszczony przykład:

#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

}

Z lub bez doładowania, niezależnie od tego, jakiego kompilatora używam, pojawia się błąd # 1, ponieważshared_ptr<KBOOM> nie dziedziczę poshared_ptr<K<int>> . Jednak,KBOOM dziedziczy zK<int>. Widać, że # 2 działa, ponieważ shared_ptr jest zaprojektowany, aby umożliwić niejawne przekazanie wskaźnika klasy podrzędnej do wskaźnika klasy bazowej, jak surowe wskaźniki.

Moje pytania to:

co uniemożliwia implementatorowi std :: shared_ptr, aby działał w przypadku # 1 (mam na myśli, zakładając, że standard uniemożliwia ten przypadek, powinien istnieć powód);czy istnieje sposób na pisanieauto kboom = std::make_shared<KBOUM>(); do_something( kboom ); bez szukania typu int z K, z którego dziedziczy KBOOM?

Uwaga: chcęuniknąć użytkownik funkcji musi pisać

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

lub

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

questionAnswers(3)

yourAnswerToTheQuestion