Функция перемещения в эмуляции unique_ptr C ++ 03

Я пытаюсь понять, как реализована C ++ 03 эмуляция unique_ptr . unique_ptr очень похож на std :: auto_ptr, но безопаснее. Он выдает ошибки компилятора в тех случаях, когда auto_ptr передал бы право владения неявно (т. Е. Незаметно). Например, простое задание. Функция move является ключом к безопасности эмуляции unique_ptr.

Вопросы:

  1. Почему существует три функции перемещения?
  2. Третья функция перемещения, которая принимает ссылку и превращает ее в rvalue, реализована (упрощена) следующим образом.

     T move (T & t) {
    вернуть T (detail_unique_ptr :: rv  (t));
    }
    

В приведенном выше коде явное преобразование в T кажется ненужным. На самом деле Visual Studio 2010 вполне устраивает без явного преобразования в T.

T move(T &t) {
  return detail_unique_ptr::rv(t);
}

g ++, clang, Comeau, однако, не любит вторую версию. Эти компиляторы жалуются на отсутствие конструктора для unique_ptr , который принимает в качестве параметра detail_unique_ptr :: rv . Это почему? unique_ptr уже определяет (неявный) конструктор, который принимает detail_unique_ptr :: rv в качестве параметра. Почему тот не выбирается автоматически?

7
задан ildjarn 9 December 2011 в 19:08
поделиться