Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
template <class A>
void swap (A& a, A& b) noexcept (noexcept(A::operator=))
{
A tmp = a;
a = b;
b = tmp;
}
template <class A>
void swap (A& a, A& b) BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(A::operator=))
{
A tmp = a;
a = b;
b = tmp;
}
Многовато кода генерируется компилятором, не правда ли? Именно из-за такого разбухания кода, в некоторых крупных корпорациях (не будем тыкать пальцем в Google) при разработке на С++ запрещено использование исключений. Еще одним примером могут послужить правила разработки для GCC начиная с версии 4.8 (да, GCC теперь разрабатывается с использованием С++, см изменения для 4.8).
В этом Google C++ Style Guide пункт про размер бинарника идёт четвёртым из пяти аргументов противnoexcept так же служит и документацией к функциям (пункт второй из Google C++ Style Guide), так что уже соотношение пунктов «за» и «против» не 5:5 а где-то 5:3
эксепшены и весь сопутствующий механизм ориентированы на минимизацию оверхеда в случае, когда они не бросаются— 100% верно для C++03, отчасти верно для C++11 в котором есть rvalue references (деструктивное копирование) и в котором уже алгоритмы подстраиваются в зависимости от спецификаторов исключений. См. «Ускорение работы стандартных алгоритмов»
Спецификатор времени компиляции noexcept в C++11