Я начал использовать c ++ std::unique_ptr
s и наткнулся на следующую проблему:
Я хочу передать ссылку на свой уникальный указатель на функцию и назначить новое значение указателю в этой функции. Интуитивно, я думаю, что функция должна принимать ссылку lvalue
, чтобы иметь возможность изменять указатель. Но в следующем примере кода оба параметра (lvalue
reference и rvalue
reference + std::move
) делают одно и то же (я полагаю).
#include <memory>
#include <utility>
struct Widget {
Widget(int) {}
};
void reseat_RValue(std::unique_ptr<Widget>&& uniqPtr) {
auto tempUniqPtr = std::make_unique<Widget>(2003);
uniqPtr = std::move(tempUniqPtr);
}
void reseat_LValue(std::unique_ptr<Widget>& uniqPtr) {
auto tempUniqPtr = std::make_unique<Widget>(2010);
uniqPtr = std::move(tempUniqPtr);
}
int main() {
auto uniqPtr = std::make_unique<Widget>(1998);
reseat_RValue(std::move(uniqPtr)); // (1)
reseat_LValue(uniqPtr); // (2)
}
Я не очень понимаю, в чем разница между (1)
и (2)
или, скорее, какой я должен использовать для моего варианта использования. Поэтому, возможно, кто-то мог бы объяснить, что происходит с каждой из этих функций и какую мне следует использовать.