Это довольно запутанно. По сути, 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 обычно заключается в том, чтобы быть конструктором перемещения или оператором присваивания перемещения, который никогда не генерирует.
Что является другим ожиданием. Конструктор перемещения и оператор присваивания перемещения (как и деструктор) никогда не должны генерировать.