Как разрешить класс с конструктором копирования, который принимает неконстантную ссылку для копирования из временных страниц?Как разрешить конструктор константной копии для временных рядов
Предпосылки это:
У меня есть функция, которая должна возвращать список указателей на объекты, которые все наследуемые из базы, так что мне нужно что-то вроде vector<Base*>
. Учитывая, что vector<auto_ptr>
не очень-то вариант, я хотел написать простую оболочку вокруг vector<Base*>
, которая удаляет все элементы в своем деструкторе.
Я столкнулся со следующей проблемой:
Мой класс имеет конструктор копирования следующим образом:
auto_list(auto_list& rhs);
так, что я могу скопировать список указателей на новый экземпляр и очистить его в старом один.
Но, очевидно, что это не будет работать с возвращаемыми значениями, потому что временные файлы не привязываются к неконстантной ссылке. Видя, что auto_ptr может быть возвращен из функций, как они его реализовали?
Примечание: Я не могу использовать C++ 11 или boost, поэтому семантика перемещения или unique_ptr не являются опцией.
Если это помогает, это мой код до сих пор:
template <typename T> class auto_list
{
private:
vector<T*> pointers;
public:
auto_list(vector<T*>& pointers)
{
this->pointers = pointers;
}
auto_list(auto_list& rhs)
{
this->pointers = rhs.pointers;
rhs.pointers.clear();
}
~auto_list()
{
for(typename vector<T*>::const_iterator it = this->pointers.begin(); it != this->pointers.end(); it++)
{
delete (*it);
}
}
auto_list& operator=(auto_list& rhs)
{
this->pointers = rhs.pointers;
rhs.pointers.clear();
}
vector<T*> get_pointers() const
{
return this->pointers;
}
};
Это кажется довольно простой исправить на самом деле. Есть ли что-то, что может взорваться? Увидев ответ Майка Сеймура, мне интересно, почему auto_ptr усложняет подобные вещи вместо использования mutable. – pezcode
Тогда вы больше не сможете объявить его 'const' для предотвращения недействительности, что сделает его еще более запутанным и подверженным ошибкам, чем' auto_ptr'. Это может быть признано недействительным, передав его * любой * функции, даже если функция принимает ссылку 'const'. –