gpt4 book ai didi

c++ - 为什么指针返回时不能自动转换为unique_ptr?

转载 作者:IT老高 更新时间:2023-10-28 22:25:03 25 4
gpt4 key购买 nike

让我通过一个例子来提出我的问题。

#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 的 self 答案,只解决了其中的一半。

指针无法自动转换,原因是:

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

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

关于c++ - 为什么指针返回时不能自动转换为unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com