unique_ptr swap不起作用

She*_*eed 3 c++ swap unique-ptr c++11

我的代码是:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

|| === 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>&'没有已知的转换

Gal*_*lik 7

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

cores[0].swap(std::unique_ptr<Core>(new Core(base))); // error
Run Code Online (Sandbox Code Playgroud)

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

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

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

cores[0] = std::unique_ptr<Core>(new Core(base));
Run Code Online (Sandbox Code Playgroud)

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

cores[0] = std::make_unique<Core>(base);
Run Code Online (Sandbox Code Playgroud)

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

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

cores[0].reset(new Core(base));
Run Code Online (Sandbox Code Playgroud)