Следующий сегмент демонстрирует мою проблему: (ошибка компиляции в GCC)
stringstream ss;
string s;
ss << "Hello";
// This fails:
// s.swap(ss.str());
// This works:
ss.str().swap(s);
Моя ошибка:
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>]
Хотя я понимаю, что str () в stringstream возвращает временное значение, это не имеет смысла, и не сразу было очевидно, что я должен был вызывать подкачку для временного с локальной переменной в качестве параметра вместо моего первого инстинкта. 1007 *
Очевидно, что прямое назначение работает лучше, и более новые стандарты C ++ имеют семантику перемещения, которая идеально подходит, но они недоступны для моей реализации.
Visual Studio не дает этой проблемы из-за того, что он расслаблен в отношении стандарта C ++. Я вроде уже понимаю всю ссылку на const на временную вещь (которая, как я полагаю, является причиной моих ошибок компиляции).
Мой вопрос:
Может кто-нибудь объяснить мне, если это единственное решение, и, возможно, объяснить мне, как думать об этом в будущем, чтобы я мог определить и обойти подобные проблемы?
(Если никто не обладает каким-либо отличным пониманием, я, по крайней мере, публикую это здесь для людей с похожими проблемами)