Das folgende Segment zeigt mein Problem: (Kompilierungsfehler auf GCC)Frage zum String mit :: swap() mit Provisorien
stringstream ss;
string s;
ss << "Hello";
// This fails:
// s.swap(ss.str());
// This works:
ss.str().swap(s);
Mein Fehler:
constSwap.cc:14: error: no matching function for call to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::swap(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
basic_string.tcc:496: note: candidates are: void std::basic_string<_CharT, _Traits, _Alloc>::swap(std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
Während ich, dass str verstehen () in stringstream gibt ein temporäres zurück, es ergibt keinen Sinn und es war nicht sofort ersichtlich, dass ich den Swap auf dem temporären mit der lokalen Variable anstelle meines ersten Instinktes als Parameter aufgerufen hätte.
Offensichtlich funktioniert die direkte Zuweisung besser, und neuere C++ - Standards haben eine Bewegungssemantik, die perfekt ist, aber diese sind für meine Implementierung nicht verfügbar.
Visual Studio gibt dieses Problem nicht, weil es über den C++ - Standard entspannt ist. Ich verstehe schon den ganzen const Verweis auf eine temporäre Sache (die ich vermute, ist der Grund für meine Kompilierungsfehler).
Meine Frage: Kann mir jemand erklären, wenn dies die einzige Lösung ist, und mir vielleicht erklären, wie ich in Zukunft darüber nachdenken soll, damit ich ähnliche Probleme erkennen und bearbeiten kann?
(Wenn niemand irgendwelche großen Einsichten hat ich zumindest dieses Posting hier für Menschen mit ähnlichen Problemen)
Eine andere Anmerkung, für einen Swap zu arbeiten muss man in einer nicht-const Referenz gehen. Und alles, was ich habe, ist (da es eine vorübergehende Rückkehr ist) ein konstanter Wert. Also verstehe ich ... es hat einfach keinen logischen Sinn ergeben, dass umgekehrt legal ist (obwohl ich verstehe, warum das auch so ist). – Marius
Kompilieren Sie den Code in VS2010, es hat 2 Varianten von Swap. Man nimmt Bezug und den anderen rvalue Verweis. Das könnte der Grund sein, warum es kompiliert wird. – Jagannath
@Jagannath: Ich benutze VS2005 im Moment, leider steht mir keine dieser neueren Techniken zur Verfügung. – Marius