簡體   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