std :: shared_ptr - 我可以使用等号(=)进行初始化吗?

时间:2017-02-09 22:45:00

标签: c++ c++11

在我阅读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你可以。

3 个答案:

答案 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对象。