智能指针不能自动用作原始指针?
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*)'
这应该如何编码?谢谢!
std::make_unique<>()
returns a std::unique_ptr
,这使得变量 x
成为类型 std::unique_ptr<int>
。这些智能指针不仅仅是原始指针,您不能像使用原始指针那样使用它们。您应该改为使用 x
上的 get()
方法来获取它指向的 int*
。
不能进行隐式转换,因为隐式转换没有上下文来做正确的事情。 printer
需要一个 non-owning 指针,但是其他需要拥有所有权的函数呢?例如
void kill(int *p) { delete p; }
在调用 kill(p);
时默默地进行转换是错误的!这将导致双重删除。指针无法知道它应该停止拥有该对象,必须通过调用 release
来告知它。其他任何东西都是错误的。
由于智能指针都是关于强制执行显式所有权语义的,因此到原始指针的转换也需要是显式的,并且有一个名称来传达所有权如何受到影响。
我正在尝试将代码转换为使用智能指针而不是原始指针。但是想知道-智能指针真的不能用作原始指针吗?
在这个例子中:
#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*)'
这应该如何编码?谢谢!
std::make_unique<>()
returns a std::unique_ptr
,这使得变量 x
成为类型 std::unique_ptr<int>
。这些智能指针不仅仅是原始指针,您不能像使用原始指针那样使用它们。您应该改为使用 x
上的 get()
方法来获取它指向的 int*
。
不能进行隐式转换,因为隐式转换没有上下文来做正确的事情。 printer
需要一个 non-owning 指针,但是其他需要拥有所有权的函数呢?例如
void kill(int *p) { delete p; }
在调用 kill(p);
时默默地进行转换是错误的!这将导致双重删除。指针无法知道它应该停止拥有该对象,必须通过调用 release
来告知它。其他任何东西都是错误的。
由于智能指针都是关于强制执行显式所有权语义的,因此到原始指针的转换也需要是显式的,并且有一个名称来传达所有权如何受到影响。