Il seguente segmento dimostra il mio problema: (errore di compilazione su GCC)domanda sull'uso stringa :: swap() con temporanei
stringstream ss;
string s;
ss << "Hello";
// This fails:
// s.swap(ss.str());
// This works:
ss.str().swap(s);
mio errore:
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>]
Mentre capisco che str () in stringstream restituisce un temporaneo, non ha senso e non era immediatamente evidente che avrei dovuto chiamare lo swap sul temporaneo con la variabile locale come parametro invece del mio primo istinto.
Ovviamente l'assegnazione diretta funziona meglio e gli standard C++ più recenti hanno una semantica che è perfetta, ma questi non sono disponibili per la mia implementazione.
Visual Studio non fornisce questo problema poiché è rilassato rispetto allo standard C++. Ho già compreso l'intero riferimento const a una cosa temporanea (che presumo sia la ragione dei miei errori di compilazione).
La mia domanda: Qualcuno può spiegarmi se questa è l'unica soluzione e forse spiegarmi come pensarlo in futuro in modo da poter individuare e risolvere problemi simili?
(Se nessuno ha qualche grandi intuizioni sto almeno distacco questo qui per le persone con problemi simili)
Un'altra nota, perché uno scambio funzioni deve passare in un riferimento non const. E tutto quello che ho è (dato che è un ritorno temporaneo) un constvalore. Quindi capisco ... non ha immediatamente senso logico che il contrario sia legale (anche se capisco perché lo sia anche). – Marius
Stai compilando il codice in VS2010, ha 2 varianti di swap. Uno prende riferimento e l'altro riferimento di valore. Questo potrebbe essere il motivo per cui sta compilando. – Jagannath
@Jagannath: Sto usando VS2005 al momento, quindi ahimè, nessuna di queste nuove tecniche sono disponibili per me. – Marius