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