Warum kann shared_ptr Vererbungsbeziehungen in der Funktionsschnittstelle nicht auflösen?

Hier ist einvereinfachtes Beispiel:

#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

}

Unabhängig davon, welchen Compiler ich verwende, erhalte ich mit oder ohne Boost einen Fehler auf # 1, weilshared_ptr<KBOOM> nicht erben vonshared_ptr<K<int>> . Jedoch,KBOOM erbt vonK<int>. Sie können sehen, dass # 2 funktioniert, da shared_ptr so konzipiert ist, dass implizit ein untergeordneter Klassenzeiger an einen Basisklassenzeiger übergeben werden kann, z. B. rohe Zeiger.

Meine Fragen sind also:

Was verhindert, dass der Implementierer std :: shared_ptr in Fall 1 funktioniert? (Ich meine, wenn der Standard diesen Fall verhindert, sollte es einen Grund geben.)gibt es eine möglichkeit zu schreibenauto kboom = std::make_shared<KBOUM>(); do_something( kboom ); ohne nach dem int-Typ von K zu suchen, von dem KBOOM erbt?

Hinweis: Ich möchtevermeiden der Benutzer der Funktion muss schreiben

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

oder

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage