为什么 shared_ptr<int> p; p=空指针;编译?

Why does shared_ptr<int> p; p=nullptr; compile?

由于std::shared_ptr的构造函数被标记为显式构造函数,所以auto p = std::make_shared<int>(1); p = new int(6);这样的表达式是错误的。

我的问题是为什么 std::make_shared<int>(1); p = nullptr; compile?

这是上述代码片段:

#include <memory>
#include <iostream>

int main()
{
    auto p = std::make_shared<int>(1);

    //p = new int(6);

    p = nullptr;

    if(!p)
    {
        std::cout << "not accessable any more" << std::endl;
    }

    p.reset();
}

此类代码可见于 std::shared_ptr: reset() vs. assignment

原始指针构造函数是 explicit 以防止您意外获得指针的所有权。由于无需担心获得 nullptr 的所有权,因此 constructor 获得 std::nullptr_t 未标记为显式。

请注意,这仅适用于 nullptr 这些其他空指针赋值可能不起作用(取决于您的编译器):

auto p = std::make_shared<int>(1);
p = NULL;
int * a = nullptr;
p = a;