让我通过一个例子来提出我的问题.
#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.
如果您正在考虑评论或添加自己的答案,请致电Herbert Sutter’s arguments for this to be possible in proposal N4029.
解决方法
答案是双重的.所有其他答案,包括一个OP的自我回答,只解决了一半.
指针无法自动转换,因为:
> unique_ptr的constructor从一个指针被声明为显式,因此仅在显式上下文中被编译器考虑.这样做是为了防止意外的危险转换,其中unique_ptr可以劫持指针并在没有程序员知识的情况下将其删除.一般来说,不仅对于unique_ptr,所以将所有单参数构造函数声明为明确以防止意外转换被认为是一个很好的做法.
> return语句是标准的隐含上下文,因此显式构造函数不适用.如果这个决定是正确的,那么这个决定是正确的,反映在EWG issue 114年,包括几个建议的链接:Herb Sutter(N4029,N4074)提出的两个版本的提案,以及两个“答复”,争论不这样做: N4094由Howard Hinnant和Ville Voutilainen和N4131由FilipRoséen.经过几次讨论和调查,问题被关闭为NAD – 不是缺陷.
目前,有几种解决方法:
return std::unique_ptr<int>{p};
要么
return std::unique_ptr<int>(p);
auto get_it() { auto p = new int; return std::unique_ptr<int>(p); }