Быть public
важно, потому что системе shared_ptr
необходим доступ к базовому классу enable_shared_from_this
данного типа. И он не может этого сделать, если он public
не доступен только для данного типа.
Нет предупреждения / ошибки для недоступного базового класса, потому что система не может узнать , что ваш код неверен.
Концептуально можно использовать конструктор shared_ptr
, который может "включить shared_from_this
", даже если enable_shared_from_this
является приватным. Зачем? Учтите следующее:
class B : public enable_shared_from_this<B> {...};
class D : private B {...};
Теперь, B
ожидает, что сможет сделать shared_from_this
гимнастику. Но D
конфиденциально унаследован от него. Так что отношение D
к B
(и, следовательно, к B::shared_from_this
) является частным. Может быть, D
использует B
таким образом, что он не вызывает использование shared_from_this
.
Так что, если D
не полагается на B::shared_from_this
, если B
- это просто деталь реализации D
, то почему возникает ошибка, если кто-то вставляет D
в shared_ptr
?
Нет такого теста, который не может привести к ложным срабатываниям, подобным этому. Поэтому, если базовый класс enable_shared_from_this
недоступен, конструкторы shared_ptr
, которые могут попытаться использовать его, просто не пытаются его использовать.