Пожалуйста, сначала посмотрите код следующим образом:
class StrBlob
{
public:
StrBlob();
// ....
private:
std::shared_ptr<std::vector<std::string> > data;
}
//initializer empty into data ;
StrBlob::StrBlob()
// : data(std::make_shared<std::vector<std::string> >()) // compile success
{
// data(std::make_shared<std::vector<std::string> >()); // compile error
}
int main()
{
// this statement can compile
std::shared_ptr<std::vector<std::string> >data(std::make_shared<std::vector<std::string> >());
return 0;
}
Я хочу знать, почему при компиляции приведенного выше оператора возникает ошибка? ?
error: no match for call to ‘(std::shared_ptr<std::vector<std::__cxx11::basic_string<char> > >)
(std::shared_ptr<std::vector<std::__cxx11::basic_string<char> > >)’
data(std::make_shared<std::vector<std::string> >());
соответствующие знания, приведенные в C++Primer 5th (глава 7.5), выглядят следующим образом:
Часто, но не всегда, мы можем игнорировать различие между инициализацией члена или его назначением. Члены, которые являются константами или ссылками, должны быть инициализированы. Точно так же должны быть инициализированы члены, относящиеся к типу класса, который не определяет конструктор по умолчанию.
Сначала я поделюсь своей мыслью. Элемент данных по умолчанию инициализируется до того, как тело конструктора начнет выполняться. Правильно? Итак, элемент данных внутри конструктора скопирует объект, созданный из функции make_shared.правильно?