次のセグメントは私の問題を示しています:(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>]
stringstreamのstr()が一時的なものを返すことは理解していますが、それは意味がなく、最初の本能ではなく、ローカル変数をパラメーターとして使用して一時的なもののスワップを呼び出す必要があることはすぐにはわかりませんでした。
明らかに、ストレート割り当ての方がうまく機能し、新しいC ++標準には完璧な移動セマンティクスがありますが、これらは私の実装では利用できません。
Visual Studioは、C ++標準について緩和されているため、この問題は発生しません。私は、一時的なものへのconst参照全体をすでに理解しています(これが私のコンパイルエラーの理由であると思います)。
私の質問:これが唯一の解決策であるかどうかを誰かに説明してもらえますか?また、同様の問題を見つけて回避できるように、将来これについて考える方法を説明してもらえますか?
(誰も素晴らしい洞察を持っていない場合、私は少なくとも同様の問題を抱えている人々のためにこれをここに投稿しています)