Почему shared_ptr не может разрешить отношения наследования в интерфейсе функций?

Вотупрощенный пример:

#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

}

С или без наддува, какой бы компилятор я не использовал, я получаю сообщение об ошибке # 1shared_ptr<KBOOM>&nbsp;не наследуй отshared_ptr<K<int>>&nbsp;, Тем не мение,KBOOM&nbsp;наследуется отK<int>, Вы можете видеть, что # 2 работает, потому что shared_ptr предназначен для неявной передачи указателя дочернего класса на указатель базового класса, как необработанные указатели.

Итак, мои вопросы:

что мешает реализации std :: shared_ptr, чтобы она работала в случае № 1 (я имею в виду, если стандарт предотвращает этот случай, должна быть причина);есть ли способ написатьauto kboom = std::make_shared<KBOUM>(); do_something( kboom );&nbsp;не смотря тип int от K, от которого наследуется KBOOM?

Примечание: я хочуизбежать&nbsp;пользователь функции должен написать

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

или же

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