Ich versuche ein Paar aus Provisorien zu konstruieren. Soweit ich weiß, stellt std :: pair die notwendigen Konstruktoren zur Verfügung, aber ich kann es nicht funktionieren lassen. Das ist mein Minimalbeispiel:Erstellen eines Paares aus Provisorien
#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);
}
Ich habe versucht, dies mit clang++-3.8 --std=c++14
zu kompilieren. Der Kopierkonstruktor für Test wird paarweise aufgerufen. Weil es gelöscht wurde, erhalte ich den Fehler call to deleted constructor of 'Test'
. Es scheint jedoch kein Problem mit dem Compiler zu sein, da ich einen ähnlichen Fehler mit gcc erhalte, siehe https://ideone.com/n5GOeR.
Kann mir jemand erklären, warum der obige Code nicht kompiliert werden kann?
Da Sie keine Möglichkeit zum Kopieren oder Verschieben eines 'Tests' hinterlassen haben, wie erwarten Sie' std :: pair's Konstruktor es zu tun? – Quentin
Ich habe versucht, den Move-Konstruktor für 'Test' explizit zu aktivieren. – user3910279
Sobald Sie den Move-Konstruktor in den 'public'-Bereich eingefügt haben, [funktioniert es] (http://coliru.stacked-crooked.com/a/77a1983a12219dfc). – Quentin