这是一个完整的程序,可以重现我的问题。
#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.
错误的全文:
std::unique_ptr
答案 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)