В соответствии с последним обновлением firebase начала использовать функции Cloud
. Облачные функции для Firebase позволяют запускать код мобильного бэкэнд, который автоматически реагирует на события, вызванные функциями Firebase и HTTPS-запросами. Ваш код хранится в облаке Google и работает в управляемой среде. Нет необходимости управлять и масштабировать собственные серверы.
Подробнее: https://firebase.google.com/docs/functions/
Попробуйте следующее:
auto ptr = std::make_shared<Func>(std::initializer_list<std::string>{"foo", "bar", "baz"});
Кланг не желает выводить тип {"foo", "bar", "baz"}
. В настоящее время я не уверен, работает ли этот язык, или если мы смотрим на ошибку компилятора.
Конструктор 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 делает не , а вместо этого переходит в собственность .
Вам нужно использовать make_shared
, если вы хотите создать новый объект, построенный из этих аргументов, на который указывает shared_ptr
. shared_ptr<T>
похож на указатель на T
- его нужно сконструировать с указателем до T
, а не T
.
Edit: совершенная пересылка на самом деле вовсе не идеальны при включении списков инициализаторов (что является сосать). Это не ошибка в компиляторе. Вам нужно будет создать rvalue типа Func
вручную.
{"foo", "bar", "baz"}
может быть массивомstd::string
,char [][]
,wchar_t [][]
.... Компилятор должен точно знать, что ему нужно создать. – BJovke 3 May 2018 в 17:47