使用初始化列表未初始化shared_ptr <string>时的编译错误

时间:2020-04-25 12:15:05

标签: shared-ptr initializer-list

在下面的代码中,pName_已在构造函数的主体内进行了初始化,在编译过程中其引发错误为:

错误:与“(std :: shared_ptr>)(std :: string )” *

的调用不匹配

pName_(新字符串(名称));

但是,如果我通过使用初始化列表进行初始化来更改其初始化方式,则它可以正常工作。为什么?

class Person
{
public:
        Person(string name) //: pName_(new string(name)){} /*UNCOMMENT THIS*/
        {
               pName_(new string(name));
        }
        void printName(){ cout<<endl<<*pName_; }
private:
        shared_ptr<string> pName_;
};

int main()
{
        vector<Person> persons;

        Person p("George");
        persons.push_back(p);

        return 0;
}

1 个答案:

答案 0 :(得分:2)

您正在尝试在构造函数的主体中使用初始化程序列表语法-本质上,您正在使用字符串参数在pName_上调用()运算符,这不会初始化您的对象,并且是编译错误的原因

无论如何,您都应该支持初始化程序列表语法,因为这意味着您的成员将不会被默认构造,然后被构造函数的主体丢弃并重新构造。

要进行编译,您需要使用复制或赋值运算符。我还将提倡在运算符new上使用make_shared。