Решил реализовать свой собственный auto_ptr в качестве упражнения (ибо я не большой спец по C++, поэтому решил начать с малого). Сразу возникли непонятные моменты.
Я не вижу никаких особых недостатков моего подхода. Однако я смотрю на реализацию в STL и не понимаю - зачем им auto_ptr_ref? Просто не вижу в нем смысла. Буду признателен, если кто-либо мне это объяснит.
Так же по ходу реализации auto_ptr возникли непонятности с оператором присваивания и конструктором копирования. Как видно из кода, мне пришлось реализовывать два оператора присваивания - теплейтный и «обычный». Это связано с тем, что компилятор (VC++ 2005 - если в новых версиях это иначе, прошу сообщить) генерит дефолтовый operator=, и игнорирует мой темплейт. Это вполне есественно - зачем инстанцировать темплейт, когда уже определена конкретная функция? Однако возникает непонятка: почему же он тогда инстанцирует темплейтный копирующий конструктор, а не использует сгенерированный дефолтовый, ведь и тот и другой генерируются по умолчанию?
В общем, я лично в замешательсве.
На первый вопрос ответить довольно легко23.03.09 22:20 Автор: amirul <Serge> Статус: The Elderman
> Я не вижу никаких особых недостатков моего подхода. Однако > я смотрю на реализацию в STL и не понимаю - зачем им > auto_ptr_ref? Просто не вижу в нем смысла. Буду > признателен, если кто-либо мне это объяснит. На первый вопрос ответить довольно легко
http://lmgtfy.com/?q=auto_ptr_ref
> что компилятор (VC++ 2005 - если в новых версиях это иначе, > прошу сообщить) генерит дефолтовый operator=, и игнорирует 9-я (2008-я) SP1 поступает так же
> мой темплейт. Это вполне есественно - зачем инстанцировать > темплейт, когда уже определена конкретная функция? Однако > возникает непонятка: почему же он тогда инстанцирует > темплейтный копирующий конструктор, а не использует > сгенерированный дефолтовый, ведь и тот и другой > генерируются по умолчанию? Вот с этим сложнее. Чувствую нужно очень внимательно читать главы 12.8 и 14.8.2 стандарта. Проще забить
> На первый вопрос ответить довольно легко > http://lmgtfy.com/?q=auto_ptr_ref Да, мне стыдно, не знаю что со мной произошло :-(
В общем, почитал. Ужос. Грязные хаки. Подумалось вдруг: если уж хаки применять, то можно было бы определить копирующий конструтор c константной ссылкой, а внутри его конст-кастить указатель. Вроде то же на то же. Хотя признаться я до конца так и не понял каким образом он так ловко находит сам собой этот auto_ptr_ref. Видимо (очевидно), я не очень хорошо понимаю правила приведения типов в C++.
В общем спасибо за помощь.
Const_cast-ить не надо. Можно просто объявить mutable24.03.09 00:08 Автор: amirul <Serge> Статус: The Elderman
> копирующий конструтор c константной ссылкой, а внутри его > конст-кастить указатель. Вроде то же на то же. Хотя Но тогда будет работать код, который работать не должен:
http://www.josuttis.com/libbook/auto_ptr.html
> признаться я до конца так и не понял каким образом он так > ловко находит сам собой этот auto_ptr_ref. Видимо > (очевидно), я не очень хорошо понимаю правила приведения > типов в C++.
> В общем спасибо за помощь. Ага. И таки да, это хак. Еще один забавный хак - бустовый unspecified_boolean_type в умных указателях.