Здравствуйте, Аноним, Вы писали:
А>Объясните пожалуйста, почему вот этот код не работает:
А>А>#include <memory>
А>struct A {};
А>struct B : A {};
А>std::auto_ptr<B> foo()
А>{
А> return std::auto_ptr<B>(new B);
А>}
А>int main()
А>{
А> std::auto_ptr<A> p = foo();
А>}
А>
А>В случае, когда везде В или А, или, если добавить "(std::auto_ptr<A>)", то все нормально.
Не понятно, что означает "не работает" (MSVC 10.0 — собирается и даже без warning-ов)?
Что сразу заметно: std::auto_ptr<A> должен удалять объект, на который он указывает, посредством вызова деструктора ~A(). Но так как этот деструктор невиртуальный, и реально p указывает на экземпляр B, то имеет место ошибка — при уничтожении p вместо вызова деструктора ~B() будет вызван ~A() (и только).
Programs must be written for people to read, and only incidentally for machines to execute