Silly(const Silly& a) : p{a.p} { *p = *a.p; }
В дополнение к копированию лежащего в основе shared_pointer создаст копию значения, указанного им. Меня беспокоит то, что shared_ptr<T>::operator*
на самом деле возвращает T&
, поэтому наше назначение изменит значение для блока управления и фактически ничего не выполнит.
Но опять же, целью было не продемонстрировать фактическое глубокое копирование, а обеспечить несогласованные операции копирования.
Глубокая копия shared_ptr
будет выглядеть так
Silly(const Silly& a) : p{make_shared<Impl>(*a.p)} {}