如何实例化
unique_ptr<int[]> sums;
在
int main(int argc, char** argv)
{
int n = //get from args
sums(new int[n]);
}
?它给了我以下编译时错误
错误 C2247:"std::d efault_delete<_Ty>::运算符 ()"不可访问 因为"std::unique_ptr>"使用 从"std::_Unique_ptr_base<_Ty,_Dx,true>"继承的"私有"
看起来您可能会对C++的构造函数调用语法感到困惑。
如果你说
unique_ptr<int[]> sums(new int[n]);
这将构造一个名为 sums
的新对象,使用指向 int 数组的指针调用构造函数。
如果你说
unique_ptr<int[]> sums;
sums(new int[n]);
它在第一行中使用 0 参数构造函数构造sums
,然后在第二行尝试调用sums
对象上的unique_ptr<int[]>::operator()(int*)
(即函数调用运算符)。这不存在,这会导致错误。
正如 dauphiic 的回答所说,您正在寻找的函数称为 reset
:
sums.reset(new int[n]);
(您可能想知道为什么存在像函数调用运算符这样愚蠢的东西。它允许您创建一个对象,该对象可以像函数一样调用,但像值一样传递。
你试图调用sums
,就好像它是一个函数,但事实并非如此。std::unique_ptr
的内部结构使错误消息令人困惑/误导。
如果要初始化sums
指向的内容,则应使用 reset
函数。
sums.reset(new int[n]);