Статическая функция-член make_shared из shared_ptr
Используя libС++, я обнаруживаю std::shared_ptr::make_shared()
статическую функцию-член в общедоступном разделе. Это очень удобно, когда я уже определил псевдоним типа для std::shared_ptr
специализации:
using T = int;
using P = std::shared_ptr< T >;
auto p = P::make_shared(123); // <=> std::make_shared< T >(123)
static_assert(std::is_same< decltype(p), P >::value);
Я беспокоюсь о стандартном соответствии, потому что статьи (1, 2) из доверенного источника ничего не упоминает о статической функции-члене make_shared
std::shared_ptr
.
Является ли плохой parctice использовать функцию в настоящее время? Почему?
Ответы
Ответ 1
При использовании этой статической функции-члена make_shared
вы зависите от расширения, специфичного для реализации g++/его стандартной библиотеки, как вы уже знаете. Для небольшого выигрыша, который вы получите от него, я предпочитаю переносить свой код и использовать std::make_shared
.
В случае упомянутого вами случая, т.е. для создания нового объекта с использованием копирования или перемещения конструктора из существующего, я могу предложить альтернативный (непроверенный, для совместимости с С++ 11 вам придется добавить возвращаемый тип возврата):
template <typename T>
auto share_ptr_to_new(T&& v) {
using T2 = typename std::remove_reference<T>::type;
return std::make_shared<T2>(std::forward<T>(v));
}
В приведенном выше примере вы можете просто написать auto p = share_ptr_to_new(123)
.
Ответ 2
FWIW, существует
template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);
как функция, не являющаяся членом.
Вы можете использовать std::make_shared
вместо std::shared_ptr::make_shared
.