Wenn ich den folgenden Code:Warum akzeptieren die C++ - Standardbibliotheksoperatoren rvalues?
std::string myString = "I'm a string.";
const std::string::iterator &myIterator = ++myString.begin();
char c = *myIterator;
std::cout << c << std::endl;
ich einen Segmentation Fault erhalten (mit O3 Optimierung kompilieren). Ich nehme an, das liegt daran, dass der Operator ++
einen std::string::iterator &
statt std::string::iterator
zurückgibt, und so erhalten wir einen Verweis auf eine temporäre. Gibt es einen Grund, warum dies nicht implementiert ist, um einen Kompilierungsfehler zu verursachen? D.h. warum ist die Unterschrift nicht die folgende?
std::string::iterator &std::string::iterator::operator++() &;
Oder noch besser, warum erfordert nicht die Spezifikation die folgenden Signaturen, so dass wir rvalues ohne Probleme umgehen kann?
std::string::iterator &std::string::iterator::operator++() &;
std::string::iterator std::string::iterator::operator++() &&;
[Kann nicht reproduziert werden] (https://ideone.com/I9Z8De). Bist du sicher, dass es an diesen Zeilen liegt? Nebenbei bemerkt, selbst wenn '++' eine Referenz zurückgibt, ist 'myIterator' keine Referenz, so dass es den Wert – Rakete1111
kopiert. Das funktioniert gut. Können Sie vollständigen Code posten? – Sumeet
Ja, Sie haben Recht. Ich habe das Beispiel geändert und es sollte jetzt abstürzen. –