std::unique_ptr的延迟初始化

Lazy initialization of std::unique_ptr

本文关键字:延迟 初始化 unique std ptr      更新时间:2023-10-16

我有一个具有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'
}

同样,如果不涉及自定义删除器,答案会改变吗(即使用自定义删除器重置和复制赋值)?

可以使用resetmove赋值操作符来赋值。

语句的问题

m_bar = std::unique_ptr<Bar, ReleaseBar>(CreateBar()); // 'ReleaseBar' is not a valid template type argument for parameter '_Dx'
如您引用的错误消息所示,

表示ReleaseBar不是一个有效的模板参数。前面的代码使用ReleaseBar的方式与它作为函数名的方式一致。在前面的代码中,对应的模板参数是void(*)(Bar*)