为什么shared_ptr<int> p; p=nullptr;编译?

Joh*_*ohn 4 c++ explicit smart-pointers shared-ptr c++11

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

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

这是前面提到的代码片段:

#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();
}
Run Code Online (Sandbox Code Playgroud)

此类代码可在std::shared_ptr: reset() vs. assignment中看到

Ala*_*les 5

原始指针构造函数是explicit为了防止您意外获取指针的所有权。由于不存在获取构造nullptr函数所有权std::nullptr_t的问题,因此未将其标记为显式。

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

auto p = std::make_shared<int>(1);
p = NULL;
int * a = nullptr;
p = a;
Run Code Online (Sandbox Code Playgroud)