テンポラリからペアを構築しようとしています。私が理解していることから、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;
^~~~
:
'Test'をコピーしたり移動したりする方法が残っていないので、' std :: pair'のコンストラクタにどうしたらいいですか? – Quentin
私は明示的に 'Test'の移動コンストラクタを有効にしようとしました。 – user3910279
移動コンストラクタを 'public'セクションの中に入れたら、それはちゃんと動作します(http://coliru.stacked-crooked.com/a/77a1983a12219dfc)。 – Quentin