make_unique, как передать сложный тип как параметр ctor? [Дубликат]

В соответствии с последним обновлением firebase начала использовать функции Cloud

. Облачные функции для Firebase позволяют запускать код мобильного бэкэнд, который автоматически реагирует на события, вызванные функциями Firebase и HTTPS-запросами. Ваш код хранится в облаке Google и работает в управляемой среде. Нет необходимости управлять и масштабировать собственные серверы.

Подробнее: https://firebase.google.com/docs/functions/

15
задан dpj 6 August 2012 в 01:08
поделиться

3 ответа

Попробуйте следующее:

auto ptr = std::make_shared<Func>(std::initializer_list<std::string>{"foo", "bar", "baz"});

Кланг не желает выводить тип {"foo", "bar", "baz"}. В настоящее время я не уверен, работает ли этот язык, или если мы смотрим на ошибку компилятора.

21
ответ дан Howard Hinnant 20 August 2018 в 10:19
поделиться
  • 1
    Последнее, что я слышал, известно, что идеальная пересылка на самом деле не идеальна вообще при списках инициализаторов. – Puppy 6 August 2012 в 01:10
  • 2
    {"foo", "bar", "baz"} не является выражением и, как таковой, не имеет типа (кроме случаев, когда используется с авто). Хотя было бы хорошо – Cubbi 6 August 2012 в 01:22
  • 3
    {"foo", "bar", "baz"} может быть массивом std::string, char [][], wchar_t [][] .... Компилятор должен точно знать, что ему нужно создать. – BJovke 3 May 2018 в 17:47

Конструктор shared_ptr<T> принимает указатель типа T* в качестве своего аргумента, предположительно указывает на динамически выделенный ресурс (или, по крайней мере, то, что может быть освобождено от делетера). С другой стороны, make_shared делает конструкцию для вас и принимает аргументы конструктора напрямую.

Итак, либо вы говорите это:

std::shared_ptr<Foo> p(new Foo('a', true, Blue));

Или, намного лучше и эффективнее :

auto p = std::make_shared<Foo>('a', true, Blue);

Последняя форма заботится о выделении и построении для вас, и в этом процессе создается более эффективная реализация.

Конечно, вы могли бы также сказать make_shared<Foo>(Foo('a', true, Blue)) , но это просто создаст ненужную копию (которая может быть отменена), и, что более важно, она создает ненужную избыточность. [ Изменить ] Для инициализации вашего вектора это может быть лучшим методом:

auto p = std::make_shared<Func>(std::vector<std::string>({"a", "b", "c"}));

Важным моментом является то, что make_shared выполняет динамическое распределение для вас, в то время как конструктор shared-ptr делает не , а вместо этого переходит в собственность .

4
ответ дан Kerrek SB 20 August 2018 в 10:19
поделиться
  • 1
    Прости. Вы, ребята, так быстро! Проблема была в make_shared. – dpj 6 August 2012 в 00:36
  • 2
    & quot; , но это просто создаст ненужную копию & quot; Неправильный ход. – ildjarn 6 August 2012 в 00:36
  • 3
    @ildjarn: Ну, все зависит от того, не так ли? Во всяком случае, "move & quot; это просто оптимизированная копия :-) – Kerrek SB 6 August 2012 в 00:38

Вам нужно использовать make_shared, если вы хотите создать новый объект, построенный из этих аргументов, на который указывает shared_ptr. shared_ptr<T> похож на указатель на T - его нужно сконструировать с указателем до T, а не T.

Edit: совершенная пересылка на самом деле вовсе не идеальны при включении списков инициализаторов (что является сосать). Это не ошибка в компиляторе. Вам нужно будет создать rvalue типа Func вручную.

3
ответ дан Puppy 20 August 2018 в 10:19
поделиться
  • 1
    Извините, проблема была в make_shared. Я поменял его на shared_ptr во время futzing. – dpj 6 August 2012 в 00:33
Другие вопросы по тегам:

Похожие вопросы: