2016-04-02 12 views
3

次のコードは、unique_ptrのコピーコンストラクタが何らかの形で呼び出されたと不平を言ってコンパイラエラーが発生して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

ああ、これは混乱です。 –

+0

うわー、素敵............ –

+2

あなたは ''と ''を含めるべきですが、それは ''ではありません。それはここで重要ではない。 –

答えて

3
  • 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したがって、コピーしようとします。
  • コンパイラが爆発します。
+2

これは言語の欠陥と見なすことができますか?これはばかげているので。 –

+0

@BarryTheHatchet:前回私が突っ込んだのは、ステートフルなアロケータと関係していました。コンパイル時に2つのアロケータが等しいかどうかを知ることはできないので、コンパイル時に移動したりコピーしなければならないかどうかはわかりません。 –

+0

@MooingDuck o.O –