Статическая функция-член 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.