繁体   English   中英

延迟初始化std :: unique_ptr

[英]Lazy initialization of std::unique_ptr

我有一个带有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移动分配运算符来分配新值。

您的陈述存在问题

m_bar = std::unique_ptr<Bar, ReleaseBar>(CreateBar()); // 'ReleaseBar' is not a valid template type argument for parameter '_Dx'

就像您引用的错误消息所指示的那样, ReleaseBar不是有效的模板参数。 先前的代码使用ReleaseBar的方式与此函数名称相同。 在先前的代码中,相应的模板参数为void(*)(Bar*)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM