使用std :: make_shared以std :: array作为参数来初始化std :: shared_ptr

时间:2019-09-27 16:21:22

标签: c++ c++11 std shared-ptr

我不明白为什么这样可以正常工作

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 个答案:

答案 0 :(得分:5)

带括号的初始化器{}永远不能推导为某种类型(在模板上下文中)。一种特殊情况是auto,它被推导为std::initializer_list。您始终必须明确定义类型。

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

答案 1 :(得分:-1)

{0, 0}的类型取决于上下文。如果使用{0, 0}立即构造另一个已知类型的对象,则它表示该对象类型的prvalue

MyClass m({0, 0}); 

此处,{0, 0}指类型为std::array<double, 2>的prvalue。 另一方面,如果类型没有约束,则{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

相关问题