88

std::unique_ptr以下のコードのように、クラスの前方宣言を組み合わせて使用​​すると便利であることがわかりました。コンパイルしてGCCで動作しますが、全体が奇妙に思えます。これが標準の動作であるかどうか(つまり、標準で要求されているかどうか)。を宣言するとき、Bは完全な型ではないのでunique_ptr

A.hpp

#include <memory>

class B;

class A {
    std::unique_ptr<B> myptr;
    // B::~B() can't be seen from here
public:
    ~A();
};

A.cpp

#include "B.hpp"
//B.hpp has to be included, otherwise it doesn't work.

A::~A() = default; // without this line, it won't compile 
// however, any destructor definiton will do.

これはデストラクタに関係していると思います(したがって、のデストラクタを呼び出す必要がありますunique_ptr<B>)は、特定のコンパイルユニット(A.cpp)で定義されています。

4

1 に答える 1

92

それは明らかに合法です。規則では、特に指定がない限り、標準ライブラリでテンプレートをインスタンス化するために使用されるタイプは完全である必要があります。の場合unique_ptr、§20.7.1/5は「[...]unique_ptrのテンプレートパラメータTは不完全な型である可能性があります」と述べています。

完全な型を必要とするポインタに対する特定の操作があります。特に、オブジェクトが実際に破棄される場合(少なくともデフォルトの削除機能を使用)。たとえば、あなたの例では、 A::~A()インラインの場合、これにより問題が発生する可能性があります。(デストラクタを自分で宣言しないと、インラインになることに注意してください。これにより、使用目的が部分的に無効になりますstd::unique_ptr。)

于 2012-11-16T10:36:31.470 に答える