Нет ничего плохого в том, чтобы принимать параметр по значению. Вы правы, что, если вы попытаетесь инициализировать параметр с помощью копии, вы получите ошибку компилятора, так как эта функция удалена. Однако вы можете инициализировать параметр value, указав в качестве аргумента значение rvalue. Например:
std::unique_ptr<int> myPtr{ /* ... */ }
std::list<std::unique_ptr<int>> elems;
push_back2(elems, myPtr); // Error, as you've noted
push_back2(elems, std::move(myPtr)); // Fine, uses move constructor to initialize
Этот синтаксис хорош тем, что заставляет вас явно указать, что вы передаете указатель на функцию.
Как только вы окажетесь внутри push_back2
, вы правы, что push_back
не сможет принять unique_ptr
, потому что попытается использовать несуществующий конструктор копирования. Чтобы это исправить, вам нужно будет снова использовать std::move
:
void push_back2(
std::list<std::unique_ptr<int>>& l, std::unique_ptr<int> a)
{
l.push_back(std::move(a)); // Fine, moves a
l.push_back(std::move(a)); // Well that was dumb, but you asked for it!
}
Я надеюсь, что я правильно истолковал ваш вопрос и что это то, что вы ищете ... дайте мне знать, если есть что-то еще, что я могу попытаться уточнить!