在我阅读the std::shared_ptr
doc时,您无法使用=
从现有指针初始化shared_ptr
。
如果您希望从现有指针初始化,唯一可用的语法是
std::shared_ptr<int> p3 (new int);
问题
您是否正确使用=
初始化shared_ptr
,如下所示:
std::shared_ptr<Foo> pFoo = new Foo(bar);
其他人(在C ++方面比我更有经验)has stated你可以。
答案 0 :(得分:6)
您无法以这种方式初始化std::shared_ptr
,因为单个参数constructor已标记为explicit
。
但您可以使用以下任意一种方法对其进行初始化:
std::shared_ptr<Foo> pFoo(new Foo(bar)); //direct-initialization
std::shared_ptr<Foo> pFoo{new Foo(bar)}; //direct-list-initialization
或者:
std::shared_ptr<Foo> pFoo = std::shared_ptr<Foo>(new Foo(bar)); //copy-initialization
std::shared_ptr<Foo> pFoo = std::shared_ptr<Foo>{new Foo(bar)}; //copy-initialization
最好还是使用<{>通常做std::make_shared<Foo>
的a single allocation:
auto pFoo = std::make_shared<Foo>(bar);
答案 1 :(得分:1)
您无法使用
等语法初始化std::shared_ptr
std::shared_ptr<int> p3 = new int;
因为构造函数标记为显式[source]
template <class Y>
explicit shared_ptr(Y* ptr);
并且此形式的初始化涉及右侧的隐式转换为shared_ptr<int>
,并且不允许隐式转换调用显式构造函数。
答案 2 :(得分:1)
你是对的:语法是非法的。您链接到的文档中的第三个构造函数标记为explicit
,这意味着正确符合的编译器和标准库实现将不允许std::shared_ptr<int> int_ptr = new int(5);
之类的内容。
有问题的用户可能不使用正确符合的编译器/库,或者可能用于没有此限制的手动shared_pointer对象。