Как вызвать std::make_shared в случае аргументов initializer_list?

Я пытаюсь использовать std::make_shared для построения объекта в куче в моей программе вместо new, но когда конструктор объекта поставляется со списком инициализаторов, простая замена не работает, и мне приходится вручную указывать точный тип:

#include <vector>
#include <memory>

struct A
{
    A( std::vector<int> ) {}
};

int main()
{
    std::shared_ptr<A> p{ new A({1}) }; //Ok
//    std::shared_ptr<A> q = std::make_shared<A>({1}); //Compiler error
    std::shared_ptr<A> q = std::make_shared<A>(std::initializer_list<int>{1}); // Ok, but too wordy
}

Есть ли способ использовать std::make_shared в такой ситуации и сохранить компактность кода (избегайте явного типа списка инициализаторов)?


person Fedor    schedule 03.07.2021    source источник
comment
Отвечает ли это на ваш вопрос? std::shared_ptr и списки инициализаторов   -  person Igor R.    schedule 03.07.2021
comment
Интересно, почему make_shared не имеет дополнительной перегрузки с initializer_list<T> в качестве первого параметра, например, например. конструктор std::optional (#7) делает это.   -  person HolyBlackCat    schedule 03.07.2021


Ответы (1)


Имеет смысл, что он не будет компилироваться. struct A не принимает список инициализаторов. И неявное преобразование недоступно.

вы можете сделать следующее: std::make_shared<AA>(std::vector<int>{ 1 });

person Community    schedule 03.07.2021