Я б зробив
std::wstringstream temp;
ss.swap(temp);
Редагувати: виправлено помилку, про яку повідомляли christianparpart та Nemo. Дякую.
PS: Наведений вище код створює новий об’єкт ланцюжка потоків у стеку і міняє місцями все, ss
що є у новому об’єкті.
Переваги:
- Це гарантує
ss
, що тепер буде у новому стані.
- Новий об'єкт створюється вбудовано і в стеці, так що компілятор може легко оптимізувати код. Зрештою це буде як скидання всіх
ss
внутрішніх даних у початковий стан.
Більше:
Порівняно з оператором присвоєння: методи обміну STL можуть бути швидшими, ніж оператори присвоєння, у випадках, коли новий об'єкт має виділений буфер у купі. У такому випадку оператору присвоєння слід виділити буфер для нового об'єкта, тоді МОЖЕ виділити інший буфер для старого об'єкта, а потім скопіювати дані з буфера нового об'єкта в новий буфер старого об'єкта. Дуже легко здійснити швидкий обмін, який просто міняє місцями, наприклад, покажчики буферів.
С ++ 11. Я бачив деяку реалізацію оператора присвоєння переміщення, яка повільніша за обмін, хоча це можна виправити, але, ймовірно, розробник STL не захоче залишати переміщений об'єкт з великою кількістю даних
std::move()
не гарантує спорожнення переміщеного об’єкта. return std::move(m_container);
не очищає m_container. Тож вам доведеться це зробити
автоматично to_return (std :: move (m_container)); m_container.clear (); повернутися до_повернення;
Що не може бути кращим за
auto to_return;
m_container.swap(to_return);
return to_return;
оскільки остання гарантує, що не буде копіювати буфери.
Тому я завжди віддаю перевагу swap()
, поки це підходить.