Разделение задач: make_shared
для встраивания счета, enable_shared_from_this
для shared_from_this
.
Нет причин смешивать эти два: библиотека не может предположить, что клиентский код имеет для требований. Разделяя их, клиентский код может выбирать то, что подходит лучше всего.
Кроме того, Boost (откуда взято shared_ptr
) также предлагает intrusive_ptr
.
(Учтите, что ваше предложение, по-видимому, не допускает пользовательских удалений. Вы могли бы исправить это, изменив enable_shared_from_this
на template<typename T, typename Deleter = default_deleter<T>> class enable_shared_from_this;
, но к этому моменту оно приближается к переизобретению intrusive_ptr
. )