Я пытаюсь понять, как реализована эмуляция unique_ptr в C++03. unique_ptr очень похож на std::auto_ptr, но безопаснее. Он выдает ошибки компилятора в тех случаях, когда auto_ptr передал бы право собственности неявно (т. е. молча). Например, простое задание. Функция move
является ключом к безопасности эмулируемого unique_ptr.
Вопросы:
- Почему существует три функции перемещения?
Третья функция перемещения, которая принимает ссылку и превращает ее в rvalue, реализована (упрощена) следующим образом.
T move(T &t) { return T(detail_unique_ptr::rv<T>(t)); }
В приведенном выше коде явное преобразование в T кажется ненужным. На самом деле Visual Studio 2010 прекрасно работает без явного преобразования в T.
T move(T &t) {
return detail_unique_ptr::rv<T>(t);
}
g++, clang, Comeau, однако, второй вариант не нравится. Эти компиляторы жалуются, что нет конструктора для unique_ptr<T>
, который принимает detail_unique_ptr::rv<T>
в качестве параметра. Почему это? unique_ptr уже определяет (неявный) конструктор, который принимает detail_unique_ptr::rv<T>
в качестве параметра. Почему этот не подхватывается автоматически?