微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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语句是标准的隐含上下文,因此显式构造函数不适用.如果这个决定是正确的,那么这个决定是正确的,反映在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);

在c 14中,您还可以使用自动扣除功能返回类型:

auto get_it() {
    auto p = new int;
    return std::unique_ptr<int>(p);
}

更新:添加了第二点的委员会问题链接.

原文地址:https://www.jb51.cc/c/114330.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐