Nano Hash - криптовалюты, майнинг, программирование

статическая функция-член make_shared для shared_ptr

Используя libc++, я обнаружил 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.

Плохо ли использовать эту функцию в настоящее время? Почему?


  • Разве тот факт, что его нет в стандарте, не является достаточной причиной? 29.01.2016
  • Вы, кажется, уже знаете, что эта функция нестандартна. Разве это не просто вопрос, основанный на мнении? 29.01.2016
  • Я только что проверил стандартную спецификацию, и она там не описана. Это похоже на конкретную реализацию. Это не работает со стандартной библиотекой С++ VS2015. 29.01.2016
  • @ Брайан Я могу предположить, что мой источник устарел, неполный или неточный, потому что это общедоступная вики. 29.01.2016
  • @Т.С. Не для меня, но, может быть, для других. 29.01.2016

Ответы:


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).

28.01.2016
  • Действительно близкой альтернативой для меня является перегрузка make_shared для std::shared_ptr где-то в пространстве имен пользователя. 29.01.2016

  • 2

    FWIW, есть

    template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);
    

    как функция, не являющаяся членом.

    Вы должны иметь возможность использовать std::make_shared вместо std::shared_ptr::make_shared.

    28.01.2016
  • Это правило для прописей для меня и многих других, кто имеет дело с <memory> C++14. 29.01.2016
  • @ Ориент, я этого не понял. 29.01.2016
  • Синонимы прописной максимы: трюизм, прописная истина. 29.01.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..