Как std::unique_ptr
обеспечивает удобный способ избежать утечек памяти и обеспечения безопасности исключений, разумно передавать их, а не сырые указатели. Таким образом, можно хотеть (член) функции с сигнатурой типа
std::unique_ptr<some_type> foo(some data);
К сожалению, при реализации такой функции нельзя просто
std::unique_ptr<some_type> foo(some data)
{
return { new some_type(data) }; // error
}
но вместо этого нужно
std::unique_ptr<some_type> foo(some data)
{
return std::move( std::unique_ptr<some_type>( new some_type(data) ) ); // awkward
}
потому что конструктор unique_ptr::unique_ptr(pointer)
равен explicit
. Какова причина этого конструктора: explicit
?
Одна мотивация создания конструкторов explicit
заключается в защите от непреднамеренного неявного преобразования типа. Однако, поскольку unique_ptr
не может быть передано по значению, это не должно быть проблемой, не так ли?