智能指针不能自动用作原始指针
Smart pointers cannot be used as raw pointers automatically?
我正在尝试将代码转换为使用智能指针而不是原始指针。 但是想知道 - 智能指针真的不可能用作原始指针吗?
在此示例中:
#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
采用非拥有指针,但其他需要所有权的函数呢?例如
void kill(int *p) { delete p; }
在呼叫kill(p);
时默默地进行转换将是错误的事情!这将导致双重删除。指针无法知道它应该停止拥有对象,必须通过调用release
来告诉它。其他任何事情都会出错。
由于智能指针都是关于强制实施显式所有权语义的,因此转换为原始指针也需要显式,并且具有传达所有权如何受到影响的名称。
std::make_unique<>()
返回一个std::unique_ptr
,这使得变量x
类型为std::unique_ptr<int>
。这些智能指针不仅仅是原始指针,您不能像原始指针一样使用它们。您应该改为在x
上使用 get()
方法来获取它指向的int*
。
相关文章:
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++指针无法更改其原始值
- 为包含原始指针的对象C++智能指针
- unique_ptr<T>::get() 返回的指针在原始unique_ptr被销毁后不是 nullptr
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上