我有一个带有std::unique_ptr
成员的类,这些成员最初被初始化为nullptr
,后来又分配了一个实际的对象。他们还使用自定义删除器。
关于这种情况,我有两个问题:是否应该使用std::unique_ptr::reset()
或复制赋值运算符将值分配给首先初始化为nullptr
的唯一指针?如果是后者,那么如何使下面的代码起作用?
class MyClass {
private:
std::unique_ptr<Foo, void(*)(Foo*)> m_foo;
std::unique_ptr<Bar, void(*)(Bar*)> m_bar;
}
MyClass::MyClass() : m_foo(nullptr, ReleaseFoo), m_bar(nullptr, ReleaseBar) { }
bool MyClass::init()
{
m_foo.reset(CreateFoo()); // works ok
m_bar = std::unique_ptr<Bar, ReleaseBar>(CreateBar()); // 'ReleaseBar' is not a valid template type argument for parameter '_Dx'
}
另外,如果不涉及自定义删除器,答案是否会改变(即对自定义删除器使用reset,否则进行副本分配)?
最佳答案
您可以使用reset
或移动分配运算符来分配新值。
您的陈述存在问题
m_bar = std::unique_ptr<Bar, ReleaseBar>(CreateBar()); // 'ReleaseBar' is not a valid template type argument for parameter '_Dx'
就像您引用的错误消息所表明的那样,
ReleaseBar
不是有效的模板参数。较早的代码使用ReleaseBar
的方式与此函数名一致。在早期的代码中,相应的模板参数为void(*)(Bar*)
。