将std :: list <std :: unique_ptr>移动到向量中会尝试引用已删除的函数

时间:2017-04-05 15:18:51

标签: c++ c++11 visual-c++

这是一个完整的程序,可以重现我的问题。

#include <vector>
#include <list>
#include <memory>
#include <utility>

int main()
{
    std::vector<std::list<std::unique_ptr<int>>> v;

    std::list<std::unique_ptr<int>> l;
    l.push_back(std::make_unique<int>(0));
    l.push_back(std::make_unique<int>(1));

    v.push_back(std::move(l)); // error
}

在最后一行,编译器抱怨正在引用delete的{​​{1}} d拷贝构造函数。

由于我将列表移动到向量中,我假设不会在列表的元素上调用复制构造函数。

为什么会这样?我该怎么办呢?

我正在使用MSVC 2017.

live example on godbolt

错误的全文:

std::unique_ptr

1 个答案:

答案 0 :(得分:15)

  

由于我将列表移动到向量中,因此我假设不会在列表的元素上调用复制构造函数。

The number of GANNAS is 3 The number of KUMAA286 is 2 The number of MATCHS02 is 1 的移动构造函数不是std::list[list.overview]),因此noexcept需要调用其复制构造函数以提供强大的异常保证。 std::vector的复制构造函数(不出所料)在列表元素上调用复制构造函数。

显然libstdc ++将std::list的移动构造函数声明为std::list,这是标准允许但不是必需的。 ([res.on.exception.handling]/5