Причина, по которой небезопасно создавать экземпляр вектора auto_pointer, заключается в том, что существует алгоритм: sort (), который делает копию одного объекта в вашем контейнере в стеке. (sort () реализует быструю сортировку, которая нуждается в "pivot")
И поэтому удаляем его при выходе из scpope функции sort ().
Также любой алгоритм или ваша собственная функция, которая может принять ваш контейнер в качестве параметра и скопировать один из его объектов в стек, приведет к этой проблеме.
Что ж, в вашем случае просто, вы должны убедиться, что ваш класс не ведет себя как auto_ptr, или гарантировать, что вы никогда не будете вызывать такую функцию / алгоритм, который может удалить ваши базовые объекты. Первое решение лучше всего, по мне:)
Таким образом, ваш конструктор копирования и ваш оператор воздействия также не должны отдавать свойство объекта-указателя.
Лучший способ добиться этого - обернуть интеллектуальный указатель надстройки вместо auto_ptr, чтобы сделать ваш контейнер безопасным при вызове такой функции / алгоритма.
Кстати, по моему мнению, определение лучшего конструктора копирования / оператора аффектации для обхода этой проблемы не является хорошим решением: я не вижу хорошей реализации конструктора копирования (а также оператора аффектации), которая могла бы защитить результат применения алгоритма sort ().