У меня имеется unique_ptr, который передаётся в функцию по значению.
void some_func(std::unique_ptr<some_class> ptr) {}
Почему когда я передаю rvalue (полученное из std::move()) оно корректно переносится в параметр? Где про это прочитать?
some_func(std::move(my_unique));
И почему, если я передаю туда же rvalue полученное через std::make_unique не происходит копирования? Это copy/move elision?
some_func(std::make_unique<some_class>());
В обоих случаях копирования не происходит, потому что в обоих случаях вызывается перемещающий (move) конструктор, создающий новый объект типа unique_ptr, передающий ему владение ресурсом и помещающий nullptr в умный указатель, передавший владение.
Таким образом, ресурс не копируется. Происходит лишь передача владения им.
Про семантику перемещения в общем можно почитать в книге "Эффективный и современный C++: 42 рекомендации по использованию C++11 и C++14" Скотта Мейерса.
С конструкторами же класса std::unique_ptr можно ознакомиться на сайте cppreference.com.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей