Ответ 1
Неправильное ограничение для построения shared_ptr из unique_ptr
[...]
Основываясь на опыте внедрения, я считаю, что правильная форма:
Примечание. Этот конструктор не должен участвовать в разрешении перегрузки, если
Y*
не совместим сT*
иunique_ptr<Y, D>::pointer
может быть конвертирован вelement_type*
.Проверка "совместим с" предотвращает нежелательные преобразования от
unique_ptr<T[]>
доshared_ptr<T>
, а проверка "конвертируемый в" гарантирует, что результатunique_ptr<Y, D>::get()
может быть сохранен вshared_ptr
и возвращенshared_ptr<T>::get()
.
Другими словами, это было намеренно недопустимо только потому, что оно не должно быть действительным, а не просто побочным эффектом других изменений.
Это имеет смысл для меня. shared_ptr<T>
, вероятно, будет читаться другими программистами, указывая только на один объект T
. Требование программистов использовать shared_ptr<T[]>
, когда они хотят несколько объектов T
, приводит к более читаемому коду.
Примечание: эта правильная форма не входит в стандарт. Однако обоснование частично является комментарием того, что находится в стандарте.