2017-01-30 11 views
4

unique_ptrをコピーしようとしたときにエラーが発生しましたunique_ptrは、コピーコンストラクタが定義されていないとして、罰金だconst unique_ptrを作成してstd :: moveを実行しようとすると、コピーコンストラクタにアクセスしようとしたときと同じエラーが発生する

Error C2280 std::unique_ptr<int,std::default_delete attempting to reference a deleted function ptrTest c:\ptrtest\main.cpp 7 
#include <memory> 

int main() 
{ 
    std::unique_ptr<int> a = std::make_unique<int>(2); 
    std::unique_ptr<int> b = a; 
} 

です。あなたは一意のポインタからそれらの間の移動(ポインタの所有権を移す)からコピーしません。

興味深いことに(OKではないかもしれません)、このコードは同じエラーをスローします。今私はそれが有効ではないことを知っている(私は最初のunique_ptr不変オブジェクトとして宣言した)、エラーメッセージは、コピーコンストラクタを呼び出すしようとしていることを意味します。あれは正しいですか?

#include <memory> 

int main() 
{ 
    const std::unique_ptr<int> a = std::make_unique<int>(2); 
    std::unique_ptr<int> b = std::move(a); 
} 
+2

'a'がconstであるため、コンストラクタは有効な候補ではありません – Sopel

+1

これは' unique_ptr'が 'auto_ptr'よりも優れている理由です。 :-) 'auto_ptr'はここでコンパイルされ、静かにconst値が変更されます。 –

+0

@ソペル、謝罪、あなたが書いたことに従わない。 – Prof

答えて

7

はい。

コンパイラがコピーの初期化とhellipを実行しようとするため、ルックアップ中に呼び出す可能性のある唯一の候補はコピーコンストラクタです。そのコンストラクタは削除されているため、それは不可能です。それは多段階のプロセスです。

これはC++クールーク(おそらく)と呼ぶことができます。診断では抽象リークが少しあります。しかし、技術的な観点からは理にかなっています。

+0

おそらく 'unique_ptr(unique_ptr const &&)= delete;'コンストラクタを持つことにそれを害することはできませんでした。 – Barry

+0

軌道の@ Lightness Races検索中に何を意味するのですか?それはstd :: moveを試みますか?const std :: unique_ptr &&が定義された移動コンストラクタがないので、const std :: unique_ptr を移動できません。それで、コピーを作成しようとすると、コピーコンストラクタが存在しないことを認識しますか? – Prof

+3

@Prof:_ "それはstd :: moveを試みますか?_私はあなたがこれによって何を意味するのかは分かりません。あなたは "std :: move"を試みることはできません。 'std :: move'はちょうどrvalueへのキャストです。最初に、コンパイラは、rvalue参照を取る**非コンストラストコンストラクタを探しますが、それを見つけることができないので、代わりにコピーコンストラクタを探すようになります。それは1つを見つけ、それを使うことを望んでいますが、後でそれが削除されていることがわかります。 _ "コピーコンストラクタはありません" _コピーコンストラクタはありますが、 "削除"されています。そこにはここに鍵となる微妙な違いがあります。 –

関連する問題