El siguiente segmento demuestra mi problema: (error de compilación en GCC)pregunta acerca del uso de string :: intercambio() con los temporales
stringstream ss;
string s;
ss << "Hello";
// This fails:
// s.swap(ss.str());
// This works:
ss.str().swap(s);
Mi error:
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>]
Si bien entiendo que str () en stringstream devuelve un temporal, no tiene sentido y no fue inmediatamente evidente que debería haber estado llamando el intercambio en el temporal con la variable local como parámetro en lugar de mi primer instinto.
Obviamente, la asignación directa funciona mejor, y los estándares más nuevos de C++ tienen una semántica de movimiento que es perfecta, pero estos no están disponibles para mi implementación.
Visual Studio no proporciona este problema debido a que se relaja con respecto al estándar de C++. Ya entiendo un poco la referencia completa de una cosa temporal (que supongo que es la razón de mis errores de compilación).
Mi pregunta es: ¿Alguien me puede explicar si esta es la única solución, y tal vez me explique cómo pensar en esto en el futuro para poder detectar y solucionar problemas similares?
(Si nadie tiene ningún grandes ideas que estoy al menos publicar esto aquí para las personas con problemas similares)
Otra nota, para que un intercambio funcione, uno tiene que pasar en una referencia no constante. Y todo lo que tengo es (dado que es un retorno temporal) un valor constante. Así que esto lo entiendo ... simplemente no tiene sentido lógico inmediato que la otra opción sea legal (aunque entiendo por qué eso también es así). – Marius
¿Está compilando el código en VS2010? Tiene 2 variantes de swap. Uno toma referencia y la otra referencia rvalue. Esa podría ser la razón por la cual está compilando. – Jagannath
@Jagannath: Estoy usando VS2005 en este momento, así que, lamentablemente, ninguna de estas técnicas más nuevas está disponible para mí. – Marius