c++ - 唯一指针: LValue Reference vs RValue Reference function calls

标签 c++ c++11 unique-ptr rvalue lvalue

我开始使用 c++ std::unique_ptrs 并偶然发现了以下问题:

我想将我的唯一指针的引用传递给函数,并为该函数中的指针分配一个新值。直观上,我认为该函数需要采用左值引用才能修改指针。但是,在下面的代码示例中,两个选项(lvalue 引用和 rvalue 引用 + 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) 之间有什么区别,或者更确切地说我应该在我的用例中使用哪一个。所以也许有人可以解释一下每个函数的情况以及我应该使用哪个函数。

最佳答案

是的,他们做同样的事情。从您的意图来看,即通过引用传递并在函数中修改它,通过左值引用传递会更好。它使你的意图更加清晰(正如@bitmask建议的那样);该函数需要一个左值并会在函数内部修改它。对于通过右值引用传递,您需要使用 std::move 将左值传递给函数,并且它允许像临时变量一样传递右值,这似乎毫无意义。例如

// meaningless; the temporary `std::unique_ptr` would be destroyed immediately
reseat_RValue(std::make_unique<Widget>(1998)); 

关于c++ - 唯一指针: LValue Reference vs RValue Reference function calls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61074231/

相关文章:

c++ - 尝试访问库中成员的功能时出现段错误

c++ - 使用 std::unique_ptr 反转二叉树

c++ - 声明 RValue 方法(例如 void opera() &&;) virtual C++1x 有意义

c++ - 抽象指向成员函数的指针 : safety and alternatives

c++ - std::bind 分配给 std::function

c++ - 如何将 std::find_if 与唯一指针 vector 一起使用?

c++ - 无法分配大小为 0 的常量数组

c++ - opencv Mat 16位来自QVector

c++ - Pimpl Idiom 的嵌套名称说明符中使用的不完整类型

c++ - 如何在 C++ 中逐行向文件添加内容?