list<auto_ptr<...> >
От: frogkiller Россия  
Дата: 01.03.06 18:12
Оценка:
Расскажите, пожалуйста, почему MSVC 7.1 ругается на сабж, говорит, не задан конструктор копии.
6-я компиляет нормально.

Смотрю определение auto_ptr'а:

    auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
        : _Myptr(_Right.release())
        {    // construct by assuming pointer from _Right auto_ptr
        }


Вот, он родимый.

Тот же код, например, с boost::shared_ptr'ом проходит "на ура".
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re: list<auto_ptr<...> >
От: alexeiz  
Дата: 01.03.06 18:17
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Расскажите, пожалуйста, почему MSVC 7.1 ругается на сабж, говорит, не задан конструктор копии.

F>6-я компиляет нормально.

http://www.gotw.ca/publications/using_auto_ptr_effectively.htm
Re: list<auto_ptr<...> >
От: jazzer Россия Skype: enerjazzer
Дата: 01.03.06 18:18
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Расскажите, пожалуйста, почему MSVC 7.1 ругается на сабж, говорит, не задан конструктор копии.

F>6-я компиляет нормально.

F>Смотрю определение auto_ptr'а:


F>
F>    auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
F>        : _Myptr(_Right.release())
F>        {    // construct by assuming pointer from _Right auto_ptr
F>        }
F>


F>Вот, он родимый.


F>Тот же код, например, с boost::shared_ptr'ом проходит "на ура".


не просто конструктор копии, а конструктор копии из константной ссылки.
Вот если бы там было auto_ptr(const auto_ptr<_Ty>& _Right) _THROW0()
Но... нет, так что положить auto_ptr в стандартный контейнер тебе не удастся, это запрещено стандартом..
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: list<auto_ptr<...> >
От: WiseAlex Беларусь  
Дата: 01.03.06 18:20
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Расскажите, пожалуйста, почему MSVC 7.1 ругается на сабж, говорит, не задан конструктор копии.

правильно ругается т.к. auto_ptr — простой "умный указатель" без счетчика ссылок и удаляет объект сразу после потери владения — соответственно конструктор копирования создает неопределенность, а потому и запрещен

F>Тот же код, например, с boost::shared_ptr'ом проходит "на ура".

на то он и shared_ptr . Собственно из-за недостатков auto_ptr он и появился
Re[2]: list<auto_ptr<...> >
От: jazzer Россия Skype: enerjazzer
Дата: 01.03.06 18:25
Оценка:
Здравствуйте, WiseAlex, Вы писали:

WA>Здравствуйте, frogkiller, Вы писали:


F>>Расскажите, пожалуйста, почему MSVC 7.1 ругается на сабж, говорит, не задан конструктор копии.

WA>правильно ругается т.к. auto_ptr — простой "умный указатель" без счетчика ссылок и удаляет объект сразу после потери владения — соответственно конструктор копирования создает неопределенность, а потому и запрещен

никакой неопределенности конструктор копирования auto_ptr не создает, происходит передача владения.

F>>Тот же код, например, с boost::shared_ptr'ом проходит "на ура".

WA>на то он и shared_ptr :). Собственно из-за недостатков auto_ptr он и появился

хватит гнобить auto_ptr — он умный указатель не глупее boost::shared_ptr, у которого своих проблем хватает.
Просто они сделаны каждый для решения своих задач: boost::shared_ptr — для совместного владения, std::auto_ptr — для передачи владения.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: list<auto_ptr<...> >
От: WiseAlex Беларусь  
Дата: 01.03.06 18:40
Оценка:
Здравствуйте, jazzer, Вы писали:

J>никакой неопределенности конструктор копирования auto_ptr не создает, происходит передача владения.

т.к. конструскор копирования на входе получает const auto_ptr & , то владение передать неудасться оно будет разделено м/у новым и старым объектом. Это и приведет к неопределенному поведению.

J>хватит гнобить auto_ptr — он умный указатель не глупее boost::shared_ptr, у которого своих проблем хватает.

J>Просто они сделаны каждый для решения своих задач: boost::shared_ptr — для совместного владения, std::auto_ptr — для передачи владения.
никто его не "гнобил" и никто не говорил о безупречности shared_ptr. Я только указал, что shared_ptr решает некоторые проблемы, присущие auto_ptr
Re[4]: list<auto_ptr<...> >
От: Pavel Chikulaev Россия  
Дата: 01.03.06 18:48
Оценка:
Здравствуйте, WiseAlex, Вы писали:

WA>Здравствуйте, jazzer, Вы писали:


J>>никакой неопределенности конструктор копирования auto_ptr не создает, происходит передача владения.

WA>т.к. конструскор копирования на входе получает const auto_ptr & , то владение передать неудасться оно будет разделено м/у новым и старым объектом. Это и приведет к неопределенному поведению.
К UB приводит другое — реализация станартной библиотеки может копировать объект произвольное количество раз при любых операциях, а для std::auto_ptr, копии не равнозначны, поэтому объект может "потерятся" или еще что-нибудь. UB одним словом. Поэтому-то стандартные контейнеры требуют, чтобы T был CopyConstructible, Assignable и для не которых операций DefaultConstructible, проще говоря все копии должны быть эквиваленты.

J>>хватит гнобить auto_ptr — он умный указатель не глупее boost::shared_ptr, у которого своих проблем хватает.

J>>Просто они сделаны каждый для решения своих задач: boost::shared_ptr — для совместного владения, std::auto_ptr — для передачи владения.
WA>никто его не "гнобил" и никто не говорил о безупречности shared_ptr. Я только указал, что shared_ptr решает некоторые проблемы, присущие auto_ptr
проблемы нет, и не было.
Re[2]: list<auto_ptr<...> >
От: Pavel Chikulaev Россия  
Дата: 01.03.06 18:57
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, frogkiller, Вы писали:


F>>Расскажите, пожалуйста, почему MSVC 7.1 ругается на сабж, говорит, не задан конструктор копии.

VC7.1 не прав, это тоже конструктор копирования (12.1/10).

J>не просто конструктор копии, а конструктор копии из константной ссылки.

J>Вот если бы там было auto_ptr(const auto_ptr<_Ty>& _Right) _THROW0()
Это не обязательно, главное — эквивалентность копий. Однако с другой стороны — это почти единственный способ статически проверить с определенной вероятностью, является ли тип CopyConstructible.

J>Но... нет, так что положить auto_ptr в стандартный контейнер тебе не удастся, это запрещено стандартом..

Почему же, разрешено, просто получишь UB. (20.4.5/3)
Re[3]: list<auto_ptr<...> >
От: Pavel Chikulaev Россия  
Дата: 01.03.06 18:59
Оценка: :)
Здравствуйте, jazzer, Вы писали:

J>хватит гнобить auto_ptr — он умный указатель не глупее boost::shared_ptr, у которого своих проблем хватает.

Формально auto_ptr не является умным указателем — поищи smart pointer в стандартне — не найдешь, однако в TR1 все новые — умные
Re[3]: list<auto_ptr<...> >
От: jazzer Россия Skype: enerjazzer
Дата: 01.03.06 19:09
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

PC>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, frogkiller, Вы писали:


F>>>Расскажите, пожалуйста, почему MSVC 7.1 ругается на сабж, говорит, не задан конструктор копии.

PC>VC7.1 не прав, это тоже конструктор копирования (12.1/10).

J>>не просто конструктор копии, а конструктор копии из константной ссылки.

J>>Вот если бы там было auto_ptr(const auto_ptr<_Ty>& _Right) _THROW0()
PC>Это не обязательно, главное — эквивалентность копий. Однако с другой стороны — это почти единственный способ статически проверить с определенной вероятностью, является ли тип CopyConstructible.

Это понятно, я говорил о сообщении компилятора (правда, я его не видел, просто предполагаю).

J>>Но... нет, так что положить auto_ptr в стандартный контейнер тебе не удастся, это запрещено стандартом..

PC>Почему же, разрешено, просто получишь UB. (20.4.5/3)
Так а компилятор разве пропустит?
Я просто не пробовал с времен шестерки, где auto_ptr был такой, как мне нужно, и его можно было хранить в контейнерах, эх, какое время было хорошее :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: list<auto_ptr<...> >
От: Pavel Chikulaev Россия  
Дата: 01.03.06 19:33
Оценка:
Здравствуйте, jazzer, Вы писали:

PC>>Это не обязательно, главное — эквивалентность копий. Однако с другой стороны — это почти единственный способ статически проверить с определенной вероятностью, является ли тип CopyConstructible.


J>Это понятно, я говорил о сообщении компилятора (правда, я его не видел, просто предполагаю).

error C2558: class 'std::auto_ptr<_Ty>' : no copy constructor available or copy constructor is declared 'explicit'

Там стоит защита
const _Ty & Val = ...;
_Ty Tmp = Val; //Лишняя копия !!! :(

Зато типа проверяет...

В VC8 ошибка другая:

error C2440: 'type cast' : cannot convert from 'std::auto_ptr<_Ty>' to 'int **'

Т.к. Dinkum там вообще вся в багах. Они нагнали сильно с auto_ptr_ref и с несколькими функциями-членами auto_ptr.
Плюс лишняя копия остается.

J>>>Но... нет, так что положить auto_ptr в стандартный контейнер тебе не удастся, это запрещено стандартом..

PC>>Почему же, разрешено, просто получишь UB. (20.4.5/3)
J>Так а компилятор разве пропустит?
Компилятор имеет право не сообщать о UB (1.3/12).
Re[5]: list<auto_ptr<...> >
От: jazzer Россия Skype: enerjazzer
Дата: 01.03.06 19:39
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

J>>>>Но... нет, так что положить auto_ptr в стандартный контейнер тебе не удастся, это запрещено стандартом..

PC>>>Почему же, разрешено, просто получишь UB. (20.4.5/3)
J>>Так а компилятор разве пропустит?
PC>Компилятор имеет право не сообщать о UB (1.3/12).

Это понятно, я об этой конкретной задаче :)
Например, в обявлении std::vector const T& много где встречается, все эти места компилятор должен зарубить.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.