Что такое auto_ptr_ref, что он достигает и как он достигает этого

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 и его внутренние элементы

Ответ 1

Это довольно запутанно. В принципе, 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 изменяет вещь, скопированную из.

Случайный связанный касатель о С++ 0x и unique_ptr

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

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

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

Ответ 3

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