Я пытаюсь понять, как реализована C ++ 03 эмуляция unique_ptr . unique_ptr очень похож на std :: auto_ptr, но безопаснее. Он выдает ошибки компилятора в тех случаях, когда auto_ptr передал бы право владения неявно (т. Е. Незаметно). Например, простое задание. Функция move
является ключом к безопасности эмуляции unique_ptr.
Вопросы:
Третья функция перемещения, которая принимает ссылку и превращает ее в 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
в качестве параметра. Почему тот не выбирается автоматически?