Инициализация std :: shared_ptr с помощью std :: make_shared с аргументом std :: array в качестве аргумента - PullRequest
2 голосов
/ 27 сентября 2019

Я не понимаю, почему это работает нормально:

std::array<double, 2> someArray = {0,1};
std::shared_ptr<MyClass> myobj = std::make_shared<MyClass>(someArray);

Но это не работает:

std::shared_ptr<MyClass> myobj = std::make_shared<MyClass>({0,1});

Компилятор говорит:

too many arguments to function ‘std::shared_ptr< _Tp> std::make_shared(_Args&& ...)
...
candidate expects 1 argument, 0 provided

Вопрос: Может кто-нибудь уточнить, почему это происходит, и если есть какой-то способ, которым я могу исправить второй подход без определения дополнительной переменной?


Редактировать: Пример MyClass:

#include <memory> //For std::shared_ptr
#include <array>
#include <iostream>

class MyClass{
  public:
    MyClass(std::array<double, 2> ){
      std::cout << "hi" << std::endl;
    };
};

Ответы [ 2 ]

4 голосов
/ 27 сентября 2019

Инициализаторы в скобках {} никогда не могут быть выведены для типа (в контексте шаблона).Особый случай - auto, где он выводится std::initializer_list.Вы всегда должны явно определять тип.

auto myobj = std::make_shared<MyClass>(std::array<double, 2>{0, 1});
0 голосов
/ 27 сентября 2019

Тип {0, 0} зависит от контекста.Если {0, 0} используется для немедленного создания другого объекта известного типа, то он представляет prvalue этого типа объекта:

MyClass m({0, 0}); 

Здесь {0, 0} относится к значению типа std::array<double, 2> С другой стороны, если для типа нет ограничений, то {0, 0} ссылается на список инициализаторов типа std::initializer_list<int>:

auto vals = {0, 0};

Нет способа инициализировать MyClass из std::initializer_list<int>, поэтому make_shared не скомпилируется:

MyClass m(vals); // Fails: can't construct MyClass from initializer list

Как это соединиться с std::make_shared? Поскольку std::make_shared является шаблоном, {0, 0} не используетсяпостроить определенный тип.В результате это рассматривается как std::initializer_list.

...