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

Puc*_*co4 3 c++ std shared-ptr c++11

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

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

但这不起作用:

std::shared_ptr<MyClass> myobj = std::make_shared<MyClass>({0,1});
Run Code Online (Sandbox Code Playgroud)

编译器说:

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

问题:有人可以弄清楚为什么会发生这种情况吗?是否有办法在不定义额外变量的情况下解决第二种方法?


编辑:的 示例MyClass

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

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

Run Code Online (Sandbox Code Playgroud)

fda*_*dan 5

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

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

  • auto myobj = std :: make_shared &lt;MyClass&gt;(std :: array {0。,1。});`也可以。 (2认同)