与unique_ptr的deque向量的编译器错误

时间:2016-04-02 00:39:07

标签: c++ c++11

以下代码无法在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)...); }

1 个答案:

答案 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因此会尝试复制它。
  • 编译器爆炸。