【发布时间】:2019-05-30 08:33:02
【问题描述】:
我正在尝试将代码转换为使用智能指针而不是原始指针。但是想知道 - 智能指针真的不可能用作原始指针吗?
在这个例子中:
#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*)'
这应该如何编码?谢谢!
【问题讨论】:
-
您需要
printer(x.get());才能访问后面的原始指针。出于充分的理由,这不是自动完成的。 -
@πάνταῥεῖ 出于极其主观的原因,它并没有隐含地完成:“原始”ptr 是“不安全的”。允许它们没有固有的问题。并且说当你继续使用 ptr 时允许转换为 ptr 太危险了,这从根本上是矛盾的。
-
@MichaelDoubez "如果允许隐式转换为 *,将静默编译 -- urk" 说隐式转换允许更多程序编译是微不足道的,但不能令人信服争论。
-
@curiousguy 智能指针都是关于所有权语义的,包装指针在这方面是二等公民。您可以期望而不是
get()的最好方法是隐式转换为std::weak_ptr<T>。
标签: c++ pointers smart-pointers implicit-conversion language-design