为什么指针返回时不能自动转换为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 中。


如果您正在考虑发表评论或添加您自己的答案,请 在提案 N4029 中解决 Herbert Sutter 的论点,以使其成为可能

原文由 einpoklum 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 582
2 个回答

答案是双重的。所有其他答案,包括 OP 的自我答案,只解决了其中的一半。

指针无法自动转换,因为:

  • unique_ptr 来自指针的 构造函数 被声明为 explicit ,因此编译器仅在显式上下文中考虑。这样做是为了防止意外的危险转换,其中 unique_ptr 可以劫持指针并在程序员不知情的情况下将其删除。通常,不仅对于 unique_ptr ,将所有单参数构造函数声明为 explicit 以防止意外转换被认为是一种好习惯。
  • return 语句被标准视为隐式上下文,因此显式构造函数不适用。如果此决定正确,则正在进行讨论,这反映在 EWG 第 114 期中,包括几个提案的链接:Herb Sutter( N4029N4074 )明确提出的两个版本的提案 return ,以及两个“响应” ”,认为不这样做:Howard Hinnant 和 Ville Voutilainen 的 N4094 和 Filip Roséen 的 N4131。经过多次讨论和民意调查,该问题被关闭为 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);
}

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

原文由 Ilya Popov 发布,翻译遵循 CC BY-SA 3.0 许可协议

因为从裸指针隐式构造 unique_ptr 非常容易出错。

只需明确地构建它:

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

原文由 Stas 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题