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
或move赋值操作符来赋值。
语句的问题
m_bar = std::unique_ptr<Bar, ReleaseBar>(CreateBar()); // 'ReleaseBar' is not a valid template type argument for parameter '_Dx'
如您引用的错误消息所示,表示ReleaseBar
不是一个有效的模板参数。前面的代码使用ReleaseBar
的方式与它作为函数名的方式一致。在前面的代码中,对应的模板参数是void(*)(Bar*)
。
相关文章:
- 模板化类中静态成员的延迟初始化
- 我的子类的属性是延迟初始化的
- 在声明或实现中延迟初始化C++单一实例
- 使用 lambda 和可变参数模板延迟初始化对象 - 任意传递值
- C++11:对延迟初始化进行安全的双重检查锁定.可能的
- 本地静态对象的非延迟初始化
- 私有类成员延迟初始化的最佳做法
- 无锁代码中的延迟初始化
- 模板和延迟初始化
- 带有转发的延迟初始化
- 有没有一种方法可以延迟初始化类的静态子对象
- 堆栈对象的延迟初始化
- c++类成员和延迟初始化
- 延迟初始化缓存..我如何使它线程安全
- 延迟初始化
- 延迟初始化要初始化的对象
- 如何实现RAII +延迟初始化
- singleton的延迟初始化问题
- c++ 11中unique_ptr的延迟初始化
- std::unique_ptr的延迟初始化