2016-08-05 33 views
2

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?

+2

Da Sie keine Möglichkeit zum Kopieren oder Verschieben eines 'Tests' hinterlassen haben, wie erwarten Sie' std :: pair's Konstruktor es zu tun? – Quentin

+0

Ich habe versucht, den Move-Konstruktor für 'Test' explizit zu aktivieren. – user3910279

+1

Sobald Sie den Move-Konstruktor in den 'public'-Bereich eingefügt haben, [funktioniert es] (http://coliru.stacked-crooked.com/a/77a1983a12219dfc). – Quentin

Antwort

5

Meine gcc (6.1.1) gibt eine etwas andere Fehlermeldung, die mehr hilfreich ist:

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

Ihr Umzug Konstruktor privat ist. Es muss offensichtlich öffentlich sein.

+0

Was seltsam ist, ist, dass dies der (gelöschte) Kopierkonstruktor ist, der nicht durch Überladungsauflösung ausgewählt werden sollte. Ich weiß nicht, welche Version von GCC Ideone verwendet, aber es sieht so aus, als hätte es einen Bug. – Quentin

+0

Ja, mein gcc gibt eine bessere Diagnose. Aktualisiert. –

+0

@Quentin Das ist seltsam, ich habe gerade versucht auf gcc.godbolt.org und jede Version von GCC beginnend mit 4.4.7 (die ältesten sie haben) korrekt Fehler über den Move-Konstruktor privat sein. –