Изучаю C++, читаю книгу Hands-on Design Patterns with C++, главу Swap and exception safety. Там есть такой пример:
class C; // Our element type
C transmogrify(C x) { return C(...); } // Some operation on C
void transmogrify(const std::vector<C>& in, std::vector<C>& out) {
out.resize(0);
out.reserve(in.size());
for (const auto& x : in) {
out.push_back(transmogrify(x));
}
}
Написано, что push_back может выкинуть exception и наш вектор out останется пустым или неполным. Предлагается такое решение:
void transmogrify(const std::vector<C>& in, std::vector<C>& out) {
std::vector tmp;
tmp.reserve(in.size());
for (const auto& x : in) {
tmp.push_back(transmogrify(x));
}
out.swap(tmp); // Must not throw!
}
Якобы swap() не выбросит исключения и теперь у нас есть strong exception guarantee и весь этот финт ушами называется идеомой copy-and-swap. Только вот я не понимаю, чем именно обусловлена стронк гарантия? Функция все так же может выбросить исключение и вызывающая функция все равно должна проверить вектор out на валидность, хотя бы размеры in и out сверить.