Причина в том, что вы не можете инициализировать unique_ptr с другим unique_ptr без , выполняющего пользовательское преобразование (в rv, путем передачи значения r в принимающий rv конструктор unique_ptr).Однако, когда явно не вызывается ctor unique_ptr
(как в unique_ptr(...)
), вы выполняете инициализацию копирования, которая в вашем случае сначала успешно создает временное значение unique_ptr, но затем не может скопировать этот временный объект в целевой объект возвращаемого значения, посколькув этой копии не разрешены пользовательские преобразования (это также известно как правило «нет двух пользовательских преобразований при инициализации»).Msvc позволяет копии использовать ctor с использованием нестандартной ссылки unique_ptr, которая является нестандартной.
При выполнении инициализации копирования класса из объекта того же класса такой двухэтапной инициализации не существует.Исходный объект просто передается неявным конструкторам unique_ptr
, которые преобразуют его в rv
с помощью конструктора rv-take и таким образом успешно создают целевой объект возвращаемого значения.
По той же причине неявное преобразование из unique_ptr<Derived>
в unique_ptr<Base>
отсутствует.На первом шаге unique_ptr<Base>
будет успешно создан, но затем при копировании этого временного объекта в целевой объект unique_ptr<Base>
ограничение на невозможность использования определенных пользователем преобразований препятствует успеху.