智能指针不能自动用作原始指针吗?

时间:2019-05-30 08:33:03

标签: c++ smart-pointers

我正在尝试将代码转换为使用智能指针而不是原始指针。但是想知道-智能指针真的不可能用作原始指针吗?

在此示例中:

#include <iostream>
#include <string>
#include <memory>

void printer(int* x)
{
    std::cout << "x = " << x << std::endl;
}

int main()
{   
    auto x = std::make_unique<int>(5);
    printer(x);
    return 0;
}

我得到一个错误:

In function 'int main()': 14:14: error: cannot convert
'std::unique_ptr<int, std::default_delete<int> >' to 'int*' for argument '1'
to 'void printer(int*)' 

该如何编码?谢谢!

2 个答案:

答案 0 :(得分:2)

不能进行隐式转换,因为隐式转换没有上下文来做正确的事情。 printer拥有一个非拥有者的指针,但是其他需要拥有所有权的函数呢?例如

void kill(int *p) { delete p; }

在调用kill(p);时无声地进行转换将是错误的事情!这将导致双重删除。指针无法知道它应该停止拥有该对象,必须通过调用release来告知它。还有什么不对。

由于智能指针都是关于强制执行显式所有权语义的,因此也需要对显式指针的转换也必须是显式的,并且其名称必须能传达所有权的影响方式。

答案 1 :(得分:0)

std::make_unique<>()返回一个std::unique_ptr,它使变量x的类型为std::unique_ptr<int>。这些智能指针不仅仅是原始指针,您不能像原始指针一样使用它们。您应该改为在get()上使用x方法来获取指向的int*