让我通过一个例子提出我的问题。
#include <memory>
std::unique_ptr<int> get_it() {
auto p = new int;
return p;
}
int main() {
auto up ( get_it() );
return 0;
}
这无法编译并出现以下错误:
a.cpp:5:9: error: could not convert ‘p’ from ‘int*’ to ‘std::unique_ptr<int>’
return p;
^
为什么这里没有从原始指针到唯一指针的自动转换?而我应该怎么做呢?
动机:我知道使用智能指针来明确所有权应该是一种好习惯;我从某个地方得到一个指针(我拥有),在这种情况下是 int*
,我(想我)想要它在 unique_ptr
中。
如果您正在考虑发表评论或添加您自己的答案,请 在提案 N4029 中解决 Herbert Sutter 的论点,以使其成为可能。
原文由 einpoklum 发布,翻译遵循 CC BY-SA 4.0 许可协议
答案是双重的。所有其他答案,包括 OP 的自我答案,只解决了其中的一半。
指针无法自动转换,因为:
unique_ptr
来自指针的 构造函数 被声明为explicit
,因此编译器仅在显式上下文中考虑。这样做是为了防止意外的危险转换,其中unique_ptr
可以劫持指针并在程序员不知情的情况下将其删除。通常,不仅对于unique_ptr
,将所有单参数构造函数声明为explicit
以防止意外转换被认为是一种好习惯。return
,以及两个“响应” ”,认为不这样做:Howard Hinnant 和 Ville Voutilainen 的 N4094 和 Filip Roséen 的 N4131。经过多次讨论和民意调查,该问题被关闭为 NAD - 不是缺陷。目前,有几种解决方法:
或者
在 c++14 中,您也可以使用函数返回类型的自动推导:
更新:为第二点添加了委员会问题的链接。