Случай 1 не компилируется , потому что вы просто не можете назначить простой указатель на auto_ptr
. Если вы хотите изменить указатель, за которым следит auto_ptr
, вы можете использовать метод сброса:
pi.reset(&i);
Теперь pi
удалит указатель, который хранился ранее.
Однако здесь вы будете хранить адрес переменной, выделенной в стеке, которую нельзя удалять . Цель std::auto_ptr
- управлять динамически размещаемой переменной.
То, что вы наблюдаете в VC ++ 2005, похоже, является ошибкой в реализации функции (возможность назначать указатели на std::auto_ptr
), которая явно не указана в стандарте (должна ли она компилироваться или не должна).
В следующем стандарте std::auto_ptr
в любом случае будет устаревшим, так что вы можете поэкспериментировать с более разумными умными указателями (boost::scoped_ptr
, boost::shared_ptr
).