Reference hereУдалить выражение
что деструктор будет неявно вызов деструктор auto_ptr объекта. И это удалит указатель , который он удерживает, что указывает на объект C - не зная определения C! Это появилось в файле .cpp, где определен конструктор структуры A .
Это было любопытно, а затем
5.3.5/5 состояний - «Если объект удаляется имеет неполный тип класса в точку удаления и полный класс имеет нетривиальный деструктор или функция деаллоляции, поведение не определено. "
Вопрос в том, почему не такая программа, которая пытается удалить указатель на неполный тип, обработанный как плохо сформированный? Почему он вталкивается в область условных (и, полный класс имеет нетривиальный деструктор ..) «неопределенное поведение»?
Что означают «и»?
EDIT 2:
ли код ниже хорошо сформирован? VS и Gcc/CLang компилируются, но Комо дает предупреждение. Я думаю, все это является частью неопределенного поведения, упомянутого в стандарте. Мой вопрос: «Почему это не плохо сформировано, но не определено»?
#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;
}
Да. Это было мое мнение. Обновлено – Chubsdad
+1, интересно. Случается ли это на самом деле, что необходимо удалить тип POD без определения? Не являются ли классы с тривиальными деструкторами наименее вероятными, чтобы они остались неполными? Hmfph. – Potatoswatter
можете ли вы указать ссылку на статью/материал, который вы упомянули в gotw? – Chubsdad