Изучаю 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 сверить.






