был конструктор raw-указателя shared_ptr ошибкой?

Оглядываясь назад, учитываяmake_shared, было быshared_ptr есть конструктор, который принимает необработанный указатель, если он был введен в C ++ 11?

Есть ли веские аргументы или варианты использования в пользу этого конструктора?

Это позволило бы избежать хорошо документированной ловушкиИсключение-безопасности ираспределение памяти / производительность использованияmake_shared.

Я считаю, что еще одно преимущество требуетshared_ptr строительство черезmake_shared было бы то, что это может быть один указатель под капотом, уменьшая использование памяти и делая такие вещи, какatomic_compare_exchange намного проще (и, возможно, более эффективно). (увидетьпрезентация из C ++ сейчас)

РЕДАКТИРОВАТЬ

Я понимаю, что shared_ptr, который в основном является intrusive_ptr (с объединенным объектом и блоком управления), не будет иметь возможностей, которые есть у текущего std :: shared_ptr. Подобно:

возможность освободить объект отдельно от контрольного блока (что хорошо, если вы долго жили слабо)

совместимость с библиотеками, которые передают вам сырые указатели и ответственность за их освобождение

возможность хранить произвольные ресурсы с пользовательскими удалителями (или без них, для не владеющих указателями)

способность указывать на подобъект (например, член), сохраняя при этом родительский объект живым.

Я предлагаю, чтобы эти функции не использовались достаточно часто (или в случае использования их в качестве raii-обертки), возможно, не подходят лучше всего, чтобы оправдать дополнительные расходы:

отдельный указатель на блок управления(потенциально) более сложная логика atomic_compare_exchange, возможно, не стоит того.

В мире C ++ 98 (где был представлен shared_ptr) make_shared менее практичен и менее удобен для пользователя (отсутствие идеальной пересылки требует использования упаковщиков ссылок, а отсутствие шаблонов с переменным числом элементов делает реализацию неуклюжей).

Ответы на вопрос(3)

Ваш ответ на вопрос