следующая функция хорошо:
void DoSomething(auto_ptr< … >& a)....
Вы можете это сделать, но я не уверен, зачем вам это нужно.
Если вы используете auto_ptr для указания права собственности на ptr (как обычно делают люди), то вам нужно передать auto_ptr функции только в том случае, если вы хотите передать право собственности на ptr функции, и в этом случае вы должны передать auto_ptr по значению:
void DoSomething(auto_ptr<int> a)
Таким образом, любой код, вызывающий DoSomething, отказывается от владения ptr:
auto_ptr<int> p (new int (7));
DoSomething (p);
// p is now empty.
В противном случае просто передайте ptr по значению:
void DoSomething(int* a)
{...}
...
auto_ptr<int> p (new int (7));
DoSomething (p.get ());
// p still holds the ptr.
или передайте ссылку на объект, на который указывает:
void DoSomething(int& a)
{...}
...
auto_ptr<int> p (new int (7));
DoSomething (*p);
// p still holds the ptr.
второй обычно предпочтительнее, поскольку он делает более очевидным, что DoSomething вряд ли попытается удалить объект.