我讀這個答案霍華德Hinnant(Is std::unique_ptr<T> required to know the full definition of T?),然後這個答案(How is a template instantiated?),我只是在想。如果你有像這樣模板實例化和pimpl成語與unique_ptr
class Something {
Something();
~Something();
class Impl;
std::unique_ptr<Impl> impl;
};
的unique_ptr
類時編譯將在此時被實例化一個類(因爲我可以從上面的其他答案做出來)。那麼爲什麼以後沒有定義類Impl
呢?實例化是否需要Impl
的析構函數存在?
注意以下是努力澄清我在上面提出的問題。
我在想這個問題,當編譯器檢查類Something
的定義時。它會看到嵌套類Impl
的聲明,然後它將看到unique_ptr<Impl>
的聲明,並在那一點上。它將用Impl
實例化模板unique_ptr
。並且該實例化的代碼將包含對Impl
的析構函數的調用。因爲在這一點上,我們的代碼包含對不完整類的析構函數的調用,上面的代碼如何安全?
成員函數爲哪個類?我還看到了第一個問題的答案,但仍然不明白,完整的'unique_ptr'類將在代碼中的指定類型(指向impl的指針的聲明)中實例化,並且該實例化將是調用'Impl'的析構函數的代碼,但這個代碼還不可見。那麼代碼是如何編譯的? – Curious
@Curious,在鏈接的答案中,「P」是「shared_ptr」或「unique_ptr」。在你的情況下,隱式生成的拷貝構造函數將調用'unique_ptr'的拷貝構造函數。將該邏輯擴展到其他編譯器生成的類的成員函數。 –
我不認爲我正在傳達我的想法,我會嘗試澄清在 – Curious