2016-08-05 1 views
2

テンポラリからペアを構築しようとしています。私が理解していることから、std :: pairは必要なコンストラクタを提供しますが、動作させることはできません。私はclang++-3.8 --std=c++14でこれをコンパイルしようとしたテンポラリからペアを作成する

#include <utility> 

struct Test { 
    Test() : a(1.0) {} 

private: 
    double a; 
    Test(Test&&) = default; 
    Test(const Test&) = delete; 
    Test& operator=(Test&&) = delete; 
}; 

int main (int argc, char** argv) { 
    std::pair<Test, double> result(Test(), 0.0); 
} 

:これは私の最小限の例です。 Testのコピーコンストラクタは、ペアによって呼び出されます。削除されたため、エラーcall to deleted constructor of 'Test'が表示されます。コンパイラには問題はないようですが、gccで同様のエラーが発生するので、https://ideone.com/n5GOeRを参照してください。

上記のコードがコンパイルに失敗する理由を誰かに説明することはできますか?あなたの移動のコンストラクタがプライベートで

t.C:8:3: note: declared private here 
    Test(Test&&) = default; 
    ^~~~ 

+2

'Test'をコピーしたり移動したりする方法が残っていないので、' std :: pair'のコンストラクタにどうしたらいいですか? – Quentin

+0

私は明示的に 'Test'の移動コンストラクタを有効にしようとしました。 – user3910279

+1

移動コンストラクタを 'public'セクションの中に入れたら、それはちゃんと動作します(http://coliru.stacked-crooked.com/a/77a1983a12219dfc)。 – Quentin

答えて

5

私はgcc(6.1.1)は、より便利で、わずかに異なるエラーメッセージを表示し、提供します。明らかに公開されている必要があります。

+0

これは、(削除された)コピーコンストラクタであり、オーバーロード解決によって選択されるべきではないということは奇妙です。私は、GCC Ideoneのどのバージョンが使用されているのか分かりませんが、バグがあるようです。 – Quentin

+0

はい、私のgccはより良い診断を提供します。更新しました。 –

+0

@Quentinこれは奇妙なことですが、私はgcc.godbolt.orgとGCCのすべてのバージョンで4.4.7(彼らが一番古いもの)から始めて、移動コンストラクタがプライベートであるというエラーを正しく試しました。 –

関連する問題