我不明白为什么这样可以正常工作
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;
};
};
答案 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
。