c – 为什么返回时不能将指针自动转换为unique_ptr?
让我通过一个例子来提出我的问题.
#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 std::unique_ptr<int>{p}; 要么 return std::unique_ptr<int>(p); 在c 14中,您还可以使用自动扣除功能返回类型: auto get_it() { auto p = new int; return std::unique_ptr<int>(p); } 更新:添加了第二点的委员会问题链接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |