以下代码无法在gcc 5.3上编译,编译器错误抱怨以某种方式调用了unique_ptr的复制构造函数。有人可以解释为什么会这样吗?
#include <iostream>
#include <memory>
#include <deque>
using Foo = std::deque<std::unique_ptr<int>>;
void foo() {
std::vector<Foo> a;
a.emplace_back(); // this fails to compile
}
编译器错误的关键行是:
gcc-4.9.2/include/c++/4.9.2/bits/stl_construct.h:75:7: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]’ { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
答案 0 :(得分:4)
vector::emplace_back
需要处理重新分配。在vector
重新分配时,现有元素已移动,如果
std::is_copy_constructible
确定);或noexcept
。否则他们被复制。这是为了保持强有力的异常安全保障。
std::deque<std::unique_ptr<int>>
移动构造函数不是noexcept
(取决于实现,可能需要分配内存)。std::deque<std::unique_ptr<int>>
可以根据std::is_copy_constructible
进行复制,因为它只检查是否存在具有正确签名的构造函数,而不是所述构造函数的主体是否实际编译。vector::emplace_back
因此会尝试复制它。