我们知道,在C++11中,make_shared可以用于类的构造函数的初始化,如下面的例子。
class test
{
public:
test(){
cout << "default constructor" << endl;
};
test(int, int){
cout << "two para test" << endl;
}
}
int main()
{
std::shared_ptr<test> pt = std::make_shared<test>();
std::shared_ptr<test> pt1 = std::make_shared<test>(1,2);
return 0;
}
这样上面的例子中,最后输出结果为:
但是如果构造函数中,使用了std::initializer_list,还可以像上面例子那样使用吗?我们来看下:
class test
{
public:
test() {
cout << "default constructor" << endl;
}
test(int, int) {
cout << "two para test" << endl;
}
test(std::string, std::initializer_list<int>){
cout << "use initializer_list" << endl;
}
};
int main()
{
std::shared_ptr<test> pt = std::make_shared<test>();
std::shared_ptr<test> pt1 = std::make_shared<test>(1, 2);
std::shared_ptr<test> pt2 = std::make_shared<test>("test", {1,2,32});
return 0;
}
编译发现, 这里会有一个错误:
其实对于构造函数中有std::initializer_list参数的,make_shared的正确使用方法为:
std::shared_ptr<test> pt2 = std::make_shared<test>("test", std::initializer_list<int>({1,2,32}));
std :: make_shared是推导传递给对象构造函数的参数类型的函数模板.不幸的是,支持列表不可推导(自动声明有异常),因此当缺少参数类型时,无法实例化函数模板.
当然也可以使用下面的方法来推导:
auto p = {1,2,32};
std::shared_ptr<test> pt2 = std::make_shared<test>("test", p);
这就是使用智能指针初始化构造函数中带有std::initializer_list的正确使用方法。