std::unique_ptr
不完全な型の例をいくつか示します。問題は破壊にあります。
でpimplを使用する場合はunique_ptr
、デストラクタを宣言する必要があります。
class foo
{
class impl;
std::unique_ptr<impl> impl_;
public:
foo(); // You may need a def. constructor to be defined elsewhere
~foo(); // Implement (with {}, or with = default;) where impl is complete
};
それ以外の場合、コンパイラはデフォルトのコンパイラを生成し、foo::impl
このための完全な宣言が必要になるためです。
テンプレートコンストラクターがある場合は、impl_
メンバーを構築しなくても失敗します。
template <typename T>
foo::foo(T bar)
{
// Here the compiler needs to know how to
// destroy impl_ in case an exception is
// thrown !
}
名前空間スコープでは、次の使用unique_ptr
も機能しません。
class impl;
std::unique_ptr<impl> impl_;
なぜなら、コンパイラーはこの静的期間オブジェクトを破棄する方法をここで知っている必要があるからです。回避策は次のとおりです。
class impl;
struct ptr_impl : std::unique_ptr<impl>
{
~ptr_impl(); // Implement (empty body) elsewhere
} impl_;