首页 文章

unique_ptr swap不起作用

提问于
浏览
3

我的代码是:

#include <memory>
#include <vector>

struct Core{
    Core(int n){} };

int main() {
    int base;
    std::vector<std::unique_ptr<Core>> cores;

    cores.push_back( std::move(std::unique_ptr<Core>(new Core(base))) );
    cores[0].swap(std::unique_ptr<Core>(new Core(base)));

    return 0;
}

我收到这个错误:

|| === Build:Test in Release(编译器:GNU GCC编译器)=== |在函数'int main()'错误:没有匹配函数调用'std :: unique_ptr <Core> :: swap(std :: unique_ptr <Core>)'注意:候选者是:注意:void std :: unique_ptr < _Tp,_Dp> :: swap(std :: unique_ptr <_Tp,_Dp>&)[with_Tp = Core; _Dp = std :: default_delete <Core>]注意:参数1从'std :: unique_ptr <Core>'到'std :: unique_ptr <Core>&'没有已知的转换

3 回答

  • 2

    你不能像这样交换临时对象( rvalue ):

    cores[0].swap(std::unique_ptr<Core>(new Core(base))); // error
    

    但是临时可以像这样交换命名对象( lvalue

    std::unique_ptr<Core>(new Core(base)).swap(cores[0]); // but this works
    

    或者,您可以直接设置值:

    cores[0] = std::unique_ptr<Core>(new Core(base));
    

    或者(更好)使用std::make_unique

    cores[0] = std::make_unique<Core>(base);
    

    您将对象的构造函数的参数直接传递给 std::make_unique 函数 .

    如果你必须使用 new ,总会有std::unique_ptr::reset函数:

    cores[0].reset(new Core(base));
    
  • 1

    您使用 std::move 太多了 . 在您的情况下,移动会自动发生 . 所以,你可以写

    cores.push_back( std::unique_ptr<Core>(new Core(base)) );
    cores[0] = std::unique_ptr<Core>(new Core(base));
    

    或者,使用 std::make_uniquestd::unique_ptr::reset

    cores.push_back( std::make_unique<Core>(base) );
    cores[0].reset(new Core(base));
    

    但是,如果您将 unique_ptr (例如)作为局部变量,则必须使用 std::move

    std::unique_ptr<Core> p(new Core(base));
    cores.push_back(std::move(p));
    

    这和上面一样有效,但是创建了一个潜在的不必要的局部变量 .

  • 7

    您需要使用左值 std::unique_ptr<Core> 进行交换,不允许使用未命名的临时值 .

    你能做的是

    cores.push_back(std::unique_ptr<Core>(new Core(base))); // don't need move here
    {
        std::unique_ptr<Core> other(new Core(base));
        cores[0].swap(other);
    }
    

相关问题