Благодаря std::make_shared
мне интересно, имеет ли конструктор для std::shared_ptr
, который принимает необработанный указатель, любое значение, кроме как при взаимодействии с устаревшим/библиотечным кодом, например. при сохранении вывода factory.
- Существуют ли другие законные варианты использования?
- Является ли разумным советом избегать этого конструктора?
- Даже в дополнение к проверке кода на месте, предупреждающей программиста всякий раз, когда он используется?
- Если к
shared_ptr<T>::reset(T*)
применяются те же рекомендации (независимо от того, что они есть)?
Что касается проверки кода:
Я знаю, что взаимодействие с устаревшим/библиотечным кодом довольно распространено, поэтому автоматическая проверка кода может быть проблематичной, но в большинстве случаев я встречался до сих пор, я бы предпочел использовать unique_ptr
в любом случае, и я также не говорю о компиляторе предупреждение, которое появляется в -Wall
, а скорее правило для анализа статического кода во время проверки кода.
Моя мотивация:
Относительно легко сказать: "Не используйте std::shared_ptr<T>(new T(...))
, всегда предпочитайте std::make_shared<T>(...)
" (что я считаю правильным советом?). Но мне интересно, если это вообще не запах дизайна, если нужно создать shared_ptr
из необработанного указателя, даже - или особенно - если объект был создан не только через new
, потому что объект должен был быть создан как "общий" или "уникальный" объект в первую очередь.