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

std::shared_ptr - can I use equal sign (=) for initialization?

本文关键字:初始化 ptr shared 语言 std 可以使 我可以      更新时间:2023-10-16

根据我对std::shared_ptr文档的阅读,您不能使用=从现有指针初始化shared_ptr

如果您希望从现有指针初始化,唯一可用的语法是
std::shared_ptr<int> p3 (new int);

问题

不能使用 = 初始化shared_ptr是否正确,如下所示:

std::shared_ptr<Foo> pFoo = new Foo(bar);

其他人(在C++方面比我更有经验(表示你可以。

不能以这种方式初始化std::shared_ptr因为单个参数构造函数标记为 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>

auto pFoo = std::make_shared<Foo>(bar);                       

不能使用语法初始化std::shared_ptr,例如

std::shared_ptr<int> p3 = new int;

因为构造函数被标记为显式 [源]

template <class Y>
explicit shared_ptr(Y* ptr);

这种形式的初始化涉及将右侧隐式转换为shared_ptr<int>,并且不允许隐式转换调用显式构造函数。

你是对的:语法是非法的。您链接到的文档中的第三个构造函数标记为 explicit ,这意味着正确符合标准的编译器和标准库实现将不允许类似 std::shared_ptr<int> int_ptr = new int(5);

有问题的用户可能没有使用正确符合要求的编译器/库,或者可能用于没有此限制的手动滚动shared_pointer对象。