У меня возникли проблемы с пониманием, почему следующая инициализация копии не компилируется:
#include <memory>
struct base{};
struct derived : base{};
struct test
{
test(std::unique_ptr<base>){}
};
int main()
{
auto pd = std::make_unique<derived>();
//test t(std::move(pd)); // this works;
test t = std::move(pd); // this doesn't
}
unique_ptr<derived>
может быть перемещена в unique_ptr<base>
, так почему второй оператор работает, а последний нет? Не явные конструкторы не учитываются при выполнении инициализации копирования?
Ошибка из gcc-8.2.0:
conversion from 'std::remove_reference<std::unique_ptr<derived, std::default_delete<derived> >&>::type'
{aka 'std::unique_ptr<derived, std::default_delete<derived> >'} to non-scalar type 'test' requested
а из clang-7.0.0 есть
candidate constructor not viable: no known conversion from 'unique_ptr<derived, default_delete<derived>>'
to 'unique_ptr<base, default_delete<base>>' for 1st argument
Живой код доступен здесь.