C++ 唯一的ptr交换不';行不通

C++ 唯一的ptr交换不';行不通,c++,c++11,swap,unique-ptr,C++,C++11,Swap,Unique Ptr,我的代码是: #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)

我的代码是:

#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;
}
#包括
#包括
结构核心{
核心(int n){};
int main(){
int-base;
向量核;
cores.push_back(标准::移动(标准::唯一的_ptr(新的核心(基础)));
核心[0]。交换(std::unique_ptr(新核心(基本));
返回0;
}
我得到了这个错误:

||==构建:测试中发布(编译器:GNU GCC编译器)===|

在函数“int main()”中出错:调用“std::unique\u ptr::swap(std::unique\u ptr)”时没有匹配的函数

注:候选人为:

注意:void std::unique\u ptr::swap(std::unique\u ptr&)[带\u Tp=Core;\u Dp=std::default\u delete]

注意:参数1没有从“std::unique\u ptr”到“std::unique\u ptr&”的已知转换


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

你能做的就是

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);
}
cores.push_-back(std::unique_ptr(new Core(base));//我不需要搬过来
{
标准::唯一的ptr其他(新核心(基础));
核心[0]。交换(其他);
}

您使用了太多的
std::move
。在您的情况下,移动会自动进行。所以,你可以直接写

cores.push_back( std::unique_ptr<Core>(new Core(base)) );
cores[0] = std::unique_ptr<Core>(new Core(base));
但是,如果您的
是唯一的\u ptr
,例如,作为局部变量,则必须使用
std::move

std::unique_ptr<Core> p(new Core(base));
cores.push_back(std::move(p));
std::unique_ptr p(新核心(基础));
核心。推回(标准::移动(p));

这与上述方法一样有效,但会创建一个潜在的不必要的局部变量。

您不能与这样的临时对象(一个
rvalue
)交换:

cores[0].swap(std::unique_ptr<Core>(new Core(base))); // error
或者,您可以直接设置该值:

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

仅供参考:由于访问未初始化的
int base
,您的代码具有未定义的行为。另外,最初的推回操作对于执行
std::move
来说是过度的,为什么您要尝试切换到临时的?
unique\u ptr::swap的签名不允许此操作。我想更改向量[0]中的内容,但不知道如何,我考虑过使用交换并让临时终止于作用域的末尾。我的gcc版本更加用户友好:
从类型为'std::unique_ptr'的右值初始化类型为'std::unique_ptr&'的非常量引用无效。
是否有其他更有效的方法来更改我的向量元素之一的内容?我使用swap作为替代方案,但它真的很好吗?它使用相同的重载
vector::push_back
move
不起任何作用第二个代码片段显然是正确/最简单的交换方法的答案。这应该被imho接受。此外,每个人都简化了他的push_back语句,这不是问题的一部分,但没有提到更简单的emplace_back(新核心(基础))@lars
emplace_back(new Core(base))
vector resize抛出时泄漏。如果我尝试分配核心[0],我会得到以下
错误:使用删除的函数'std::unique_ptr&std::unique_ptr::operator=(const std::unique_ptr&)[with _Tp=Core;\u Dp=std::default_delete]。
@Sheed你是用我在这里做的方法做的吗?只能指定这样的临时对象,而不能指定命名对象。如果要指定命名对象,则必须使用
std::move()
std::unique_ptr<Core>(new Core(base)).swap(cores[0]); // but this works
cores[0] = std::unique_ptr<Core>(new Core(base));
cores[0] = std::make_unique<Core>(base);
cores[0].reset(new Core(base));