ここを参照
そのデストラクタは、auto_ptr オブジェクトのデストラクタも暗黙的に呼び出します。そして、それが保持しているCオブジェクトを指すポインターを削除します-Cの定義を知らなくても!これは、構造体 A のコンストラクターが定義されている .cpp ファイルに表示されます。
これは興味深く、その後
5.3.5/5 は次のように述べています - 「削除されるオブジェクトが削除の時点で不完全なクラス型を持ち、完全なクラスに重要なデストラクタまたは割り当て解除関数がある場合、動作は未定義です。」
私の質問は、不完全な型へのポインターを削除しようとするようなプログラムが不正な形式として扱われないのはなぜですか? 条件付きの領域にプッシュされるのはなぜですか(そして完全なクラスには自明ではないデストラクタがあります..)「未定義の動作」ですか?
'と' は何を意味しますか?
編集2:
以下のコードは整形式ですか?VS と Gcc/CLang はコンパイルしますが、Comeau は警告を出します。これはすべて、標準で言及されている未定義の動作の一部だと思います。私の質問は、「なぜこれは不正ではないのに定義されていないのか」ということです。
#include <iostream>
#include <memory>
using namespace std;
struct C;
// Is this the POI for auto_ptr<C>? $14.6.4.1/3
struct A{
A();
auto_ptr<C> mc;
~A(){} // how does it link to C::~C at this point?
};
struct C{};
A::A():mc(new C){}
int main(){
A a;
}