C++:如何使std::unique_ptr指向一个新的整数?

C++:如何使std::unique_ptr指向一个新的整数?,c++,unique-ptr,C++,Unique Ptr,我有以下代码: int my_function(int x) { return x+1; } void find_my_next_idx(std::unique_ptr<int> my_idx_ptr) { // do something here // update my_idx_ptr } std::unique_ptr<int> my_idx_ptr = std::make_unique<int>(my_function(5)

我有以下代码:

int my_function(int x) {
    return x+1;
}

void find_my_next_idx(std::unique_ptr<int> my_idx_ptr) {
    // do something here
    // update my_idx_ptr
}

std::unique_ptr<int> my_idx_ptr = std::make_unique<int>(my_function(5));
if (!my_flag) {
    int a = 4;
    my_idx_ptr.reset(std::move(&a));
}

find_my_next_idx(my_idx_ptr); // --> error line
然后我得到了以下错误:

error: call to implicitly-deleted copy constructor of 'std::unique_ptr<int>'

我做错了什么?如何使我的_idx_ptr指向不同的整数值?谢谢

std::unique\u ptr在内部存储指针,因此它将其数据与堆上的new一起存储。您试图std::从堆栈上的局部变量移动指针,这是错误的,因为局部变量在vlosing}处被销毁

试着简单地使用my_idx_ptr=std::make_unique5

通常,您很少使用std::move,因为编译器将根据变量是左值还是右值来选择正确的函数。

如果您希望unique_ptr包含值4,您可以简单地执行以下操作:

my_idx_ptr = std::make_unique(4);
您不必担心在执行此操作时前一个对象会发生什么,因为它会破坏前一个对象并获得新对象的所有权

由于无法复制unique_ptr,这是调用find_my_next_idx时出错的原因,您可以:

通过引用传递唯一的\u ptr 在函数调用中使用std::move。 第一个选项要求您将功能原型更改为:

void find_my_next_idx(std::unique_ptr<int>& my_idx_ptr);
无法复制唯一的\u ptr,但您可以移动它:

std::unique_ptr<int> my_idx_ptr = std::make_unique<int>(my_function(5));
if (!my_flag) {
    int a = 4;
    my_idx_ptr.reset(std::move(&a));
}

find_my_next_idx( std::move(my_idx_ptr) );

您发布的代码不会产生该错误。请发布导致错误消息的确切代码以及my_idx_ptr.resetstd::move&a;是一个逻辑错误,可能是my_idx_ptr=std::make_uniquea;。但这与您的错误消息无关。消息应该与一个行号相关联,该行号告诉您错误的实际位置。上面的代码将被编译,但在my_idx_ptr被销毁时将导致UB。它不会做你可能希望它做的事情。对不起,更新了问题。
std::unique_ptr<int> my_idx_ptr = std::make_unique<int>(my_function(5));
if (!my_flag) {
    int a = 4;
    my_idx_ptr.reset(std::move(&a));
}

find_my_next_idx( std::move(my_idx_ptr) );
my_idx_ptr.reset(new int(a)); // create new int onto heap