gpt4 book ai didi

c++ - 为什么 make_unique 不能与 unique_ptr::reset 一起使用?

转载 作者:可可西里 更新时间:2023-11-01 17:04:04 24 4
gpt4 key购买 nike

我尝试用 VS2013 编译一些 C++ 代码,unique_ptr::reset() 似乎不适用于 make_unique();一个小的可编译重现代码片段如下:

#include <memory>
using namespace std;

int main() {
unique_ptr<int[]> p = make_unique<int[]>(3);
p.reset(make_unique<int[]>(10));
}

从命令行编译:

C:\Temp\CppTests>cl /EHsc /W4 /nologo test.cpp

这些是来自 MSVC 编译器的错误:

test.cpp(6) : error C2280: 'void std::unique_ptr<int [],std::default_delete<_Ty>
>::reset<std::unique_ptr<_Ty,std::default_delete<_Ty>>>(_Ptr2)' : attempting to
reference a deleted function
with
[
_Ty=int []
, _Ptr2=std::unique_ptr<int [],std::default_delete<int []>>
]
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\memory(16
23) : see declaration of 'std::unique_ptr<int [],std::default_delete<_Ty>>::rese
t'
with
[
_Ty=int []
]

但是,下面的代码似乎可以正常编译:

p = make_unique<int[]>(10);

这种行为的原因是什么?为什么 unique_ptr::operator=() 可以与 make_unique() 一起使用,而 unique_ptr::reset() 却不能?

最佳答案

reset() 接受一个指针。

你似乎想要的是简单的移动分配:

#include <memory>
using namespace std;

int main() {
unique_ptr<int[]> p = make_unique<int[]>(3);
p = make_unique<int[]>(10);
}

一些编译器可能仍然希望您在那里指定 std::move(),但这并不是严格要求的。

关于c++ - 为什么 make_unique 不能与 unique_ptr::reset 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22796788/

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