что такое auto_ptr_ref, чего он добивается и как он этого добивается - PullRequest
10 голосов
/ 23 января 2010

auto_ptr_ref документация здесь говорит это

This is an instrumental class to allow certain conversions that allow auto_ptr objects to be passed to and returned from functions.

Может кто-нибудь объяснить, как auto_ptr_ref помогает в достижении этого. Я просто хочу понять класс auto_ptr и его внутренности

Ответы [ 3 ]

15 голосов
/ 23 января 2010

Это довольно запутанно. По сути, auto_ptr_ref существует, потому что конструктор копирования auto_ptr на самом деле не является конструктором копирования в стандартном смысле этого слова.

Конструкторы копирования обычно имеют подпись, которая выглядит так:

X(const X &b);

Конструктор копирования auto_ptr имеет подпись, которая выглядит следующим образом:

X(X &b)

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

Иногда временные файлы не могут соответствовать конструктору копирования, который не объявляет свой аргумент const. Вот тут и приходит auto_ptr_ref. Компилятор не сможет вызвать неконстантную версию конструктора копирования, но может вызвать оператор преобразования. Оператор преобразования создает объект auto_ptr_ref, который является всего лишь временным держателем указателя. Конструктор auto_ptr или operator = вызывается с аргументом auto_ptr_ref.

Если вы заметили, оператор преобразования в auto_ptr, который автоматически преобразует в auto_ptr_ref, делает release в источнике auto_ptr, так же, как это делает конструктор копирования.

Это какой-то странный маленький танец, который происходит за сценой, потому что auto_ptr изменяет объект, с которого копируется.

Случайное отношение к C ++ 0x и unique_ptr

В C ++ 0x auto_ptr не рекомендуется в пользу unique_ptr. unique_ptr даже не имеет конструктора копирования и использует новый «конструктор перемещения», который явно говорит о том, что он изменит объект, из которого перемещается объект, и оставит его бесполезным (но все же действующим ) государство. Временные значения (или значения) явно всегда могут быть аргументами конструктора перемещения.

Конструктор перемещения в C ++ 0x имеет ряд других больших преимуществ. Это позволяет стандартным контейнерам STL хранить unique_ptr с и делать все правильно, в отличие от того, чем auto_ptr с не может быть. Это также в основном устраняет необходимость в функции swap, поскольку основная функция функции swap обычно заключается в том, чтобы быть конструктором перемещения или оператором присваивания перемещения, который никогда не генерирует.

Что является другим ожиданием. Конструктор перемещения и оператор присваивания перемещения (как и деструктор) никогда не должны генерировать.

2 голосов
/ 23 января 2010

Я только что нашел очень хорошую ссылку и название для этой техники "Move Constructors" или "Colvin-Gibbons trick"

http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor

0 голосов
/ 07 декабря 2011

В результате можно хранить умные указатели в контейнерах (например, QMap) с помощью auto_ptr_ref. Необходимо только инициализировать auto_ptr_ref из auto_ptr при вставке и обратно auto_ptr из auto_ptr_ref для работы.

...